1/*
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 *
6 * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
7 */
8
9/*
10 * authors M Kersten, N Nes
11 * SQL catalog support implementation
12 * This module contains the wrappers around the SQL catalog operations
13 */
14#include "monetdb_config.h"
15#include "sql_transaction.h"
16#include "sql_gencode.h"
17#include "sql_optimizer.h"
18#include "sql_scenario.h"
19#include "sql_mvc.h"
20#include "sql_qc.h"
21#include "sql_optimizer.h"
22#include "mal_namespace.h"
23#include "opt_prelude.h"
24#include "querylog.h"
25#include "mal_builder.h"
26#include "mal_debugger.h"
27
28#include "rel_select.h"
29#include "rel_optimizer.h"
30#include "rel_prop.h"
31#include "rel_rel.h"
32#include "rel_exp.h"
33#include "rel_bin.h"
34#include "rel_dump.h"
35#include "rel_remote.h"
36#include "orderidx.h"
37
38#define initcontext() \
39 if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)\
40 return msg;\
41 if ((msg = checkSQLContext(cntxt)) != NULL)\
42 return msg; \
43 if (name && strcmp(name, str_nil) == 0)\
44 name = NULL;
45
46str
47SQLtransaction_release(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
48{
49 mvc *sql = NULL;
50 str msg;
51 int chain = *getArgReference_int(stk, pci, 1);
52 str name = *getArgReference_str(stk, pci, 2);
53
54 initcontext();
55
56 (void) chain;
57 if (sql->session->auto_commit == 1)
58 throw(SQL, "sql.trans", SQLSTATE(3BM30) "RELEASE SAVEPOINT: not allowed in auto commit mode");
59 return mvc_release(sql, name);
60}
61
62str
63SQLtransaction_commit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
64{
65 mvc *sql = NULL;
66 str msg;
67 int chain = *getArgReference_int(stk, pci, 1);
68 str name = *getArgReference_str(stk, pci, 2);
69
70 initcontext();
71
72 if (sql->session->auto_commit == 1) {
73 if (name)
74 throw(SQL, "sql.trans", SQLSTATE(3BM30) "SAVEPOINT: not allowed in auto commit mode");
75 else
76 throw(SQL, "sql.trans", SQLSTATE(2DM30) "COMMIT: not allowed in auto commit mode");
77 }
78 return mvc_commit(sql, chain, name, false);
79}
80
81str
82SQLtransaction_rollback(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
83{
84 mvc *sql = NULL;
85 str msg;
86 int chain = *getArgReference_int(stk, pci, 1);
87 str name = *getArgReference_str(stk, pci, 2);
88
89 initcontext();
90
91 if (sql->session->auto_commit == 1)
92 throw(SQL, "sql.trans", SQLSTATE(2DM30) "ROLLBACK: not allowed in auto commit mode");
93 return mvc_rollback(sql, chain, name, false);
94}
95
96str
97SQLtransaction_begin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
98{
99 mvc *sql = NULL;
100 str msg;
101 int chain = *getArgReference_int(stk, pci, 1);
102 str name = *getArgReference_str(stk, pci, 2);
103 int ret = 0;
104
105 initcontext();
106
107 if (sql->session->auto_commit == 0)
108 throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION: cannot start a transaction within a transaction");
109 if (sql->session->tr->active)
110 msg = mvc_rollback(sql, 0, NULL, false);
111 sql->session->auto_commit = 0;
112 sql->session->ac_on_commit = 1;
113 sql->session->level = chain;
114 ret = mvc_trans(sql);
115 if(msg)
116 return msg;
117 else if(ret < 0)
118 throw(SQL, "sql.trans", SQLSTATE(HY001) MAL_MALLOC_FAIL);
119 return MAL_SUCCEED;
120}
121
122str
123SQLtransaction2(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
124{
125 mvc *sql = NULL;
126 str msg;
127 int ret = 0;
128
129 (void) stk;
130 (void) pci;
131
132 if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)
133 return msg;
134 if ((msg = checkSQLContext(cntxt)) != NULL)
135 return msg;
136 if (sql->session->auto_commit == 0)
137 throw(SQL, "sql.trans", SQLSTATE(25001) "START TRANSACTION: cannot start a transaction within a transaction");
138 if (sql->session->tr->active)
139 msg = mvc_rollback(sql, 0, NULL, false);
140 sql->session->auto_commit = 0;
141 sql->session->ac_on_commit = 1;
142 sql->session->level = 0;
143 ret = mvc_trans(sql);
144 if(msg)
145 return msg;
146 else if(ret < 0)
147 throw(SQL, "sql.trans", SQLSTATE(HY001) MAL_MALLOC_FAIL);
148 return MAL_SUCCEED;
149}
150