Update of /cvsroot/monetdb/sql/src/server
In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22885/src/server
Modified Files:
Makefile.ag bin_optimizer.mx rel_bin.mx rel_dump.mx
rel_optimizer.mx rel_select.mx rel_semantic.mx rel_updates.mx
sql_mvc.mx sql_rel2bin.mx sql_semantic.mx sql_statement.mx
sql_trans.mx
Added Files:
rel_trans.mx
Log Message:
transactions are now first only parsed, and then executed via mal.
Index: bin_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/bin_optimizer.mx,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- bin_optimizer.mx 29 Nov 2009 09:32:22 -0000 1.22
+++ bin_optimizer.mx 13 Dec 2009 20:33:16 -0000 1.23
@@ -540,6 +540,7 @@
case st_column:
case st_append:
case st_exception:
+ case st_trans:
case st_aggr:
case st_unop:
Index: sql_semantic.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_semantic.mx,v
retrieving revision 1.199
retrieving revision 1.200
diff -u -d -r1.199 -r1.200
--- sql_semantic.mx 29 Nov 2009 19:51:40 -0000 1.199
+++ sql_semantic.mx 13 Dec 2009 20:33:16 -0000 1.200
@@ -993,14 +993,16 @@
return NULL;
switch (s->token) {
+/*
case TR_COMMIT:
case TR_SAVEPOINT:
case TR_RELEASE:
case TR_ROLLBACK:
case TR_START:
case TR_MODE:
- res = transactions(sql, s);
+ res = sql_transactions(sql, s);
break;
+*/
case SQL_CREATE_SCHEMA:
case SQL_DROP_SCHEMA:
case SQL_CREATE_TABLE:
--- NEW FILE: rel_trans.mx ---
@' The contents of this file are subject to the MonetDB Public License
@' Version 1.1 (the "License"); you may not use this file except in
@' compliance with the License. You may obtain a copy of the License at
@' http://monetdb.cwi.nl/Legal/MonetDBLicense-1.1.html
@'
@' Software distributed under the License is distributed on an "AS IS"
@' basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
@' License for the specific language governing rights and limitations
@' under the License.
@'
@' The Original Code is the MonetDB Database System.
@'
@' The Initial Developer of the Original Code is CWI.
@' Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
@' Copyright August 2008-2009 MonetDB B.V.
@' All Rights Reserved.
@f rel_trans
@a N.J. Nes
@*
@h
#ifndef _REL_TRANS_H_
#define _REL_TRANS_H_
#include "sql_symbol.h"
#include "sql_mvc.h"
#include "sql_relation.h"
#define tr_none 0
#define tr_readonly 1
#define tr_writable 2
#define tr_serializable 4
extern sql_rel *rel_transactions(mvc *sql, symbol *sym);
#endif /*_REL_TRANS_H_*/
@c
#include "sql_config.h"
#include "rel_trans.h"
#include "rel_select.h"
#include "rel_exp.h"
#include "sql_parser.h"
static sql_rel *
rel_trans(int trans_type, int nr, char *name)
{
sql_rel *rel = rel_create();
list *exps = new_exp_list();
append(exps, exp_atom_int(nr));
if (name)
append(exps, exp_atom_clob(name));
rel->l = NULL;
rel->r = NULL;
rel->op = op_ddl;
rel->flag = trans_type;
rel->exps = exps;
rel->card = 0;
rel->nrcols = 0;
return rel;
}
sql_rel *
rel_transactions(mvc *sql, symbol *s)
{
sql_rel *ret = NULL;
switch (s->token) {
case TR_RELEASE:
ret = rel_trans(DDL_RELEASE, 0, s->data.sval);
break;
case TR_COMMIT:
assert(s->type == type_int);
ret = rel_trans(DDL_COMMIT, s->data.i_val, NULL);
break;
case TR_SAVEPOINT:
ret = rel_trans(DDL_COMMIT, 0, s->data.sval);
break;
case TR_ROLLBACK: {
dnode *n = s->data.lval->h;
assert(n->type == type_int);
ret= rel_trans(DDL_ROLLBACK, n->data.i_val, n->next->data.sval);
} break;
case TR_START:
case TR_MODE:
assert(s->type == type_int);
ret = rel_trans(DDL_TRANS, s->data.i_val, NULL);
break;
default:
return sql_error(sql, 01, "transaction unknown Symbol(" PTRFMT
")->token = %s", PTRFMTCAST s, token2string(s->token));
}
return ret;
}
Index: sql_trans.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_trans.mx,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- sql_trans.mx 7 Jan 2009 14:19:29 -0000 1.29
+++ sql_trans.mx 13 Dec 2009 20:33:16 -0000 1.30
@@ -34,7 +34,7 @@
#define tr_writable 2
#define tr_serializable 4
-extern stmt *transactions(mvc *sql, symbol *sym);
+extern stmt *sql_transactions(mvc *sql, symbol *sym);
#endif /*_SQL_TRANS_H_*/
@@ -46,7 +46,7 @@
#include "sql_env.h"
stmt *
-transactions(mvc *sql, symbol *s)
+sql_transactions(mvc *sql, symbol *s)
{
int ret = 0;
Index: rel_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_optimizer.mx,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -d -r1.78 -r1.79
--- rel_optimizer.mx 2 Dec 2009 13:06:09 -0000 1.78
+++ rel_optimizer.mx 13 Dec 2009 20:33:16 -0000 1.79
@@ -106,7 +106,7 @@
case op_inter:
case op_except:
case op_topn:
- case op_output:
+ case op_ddl:
return name_find_column( rel->l, rname, name);
case op_project:
case op_groupby:
@@ -189,7 +189,7 @@
case op_select:
case op_groupby:
case op_topn:
- case op_output:
+ case op_ddl:
if (rel->l)
rel_properties(sql, gp, rel->l);
break;
@@ -230,7 +230,7 @@
case op_insert:
case op_update:
case op_delete:
- case op_output:
+ case op_ddl:
break;
}
}
@@ -2663,7 +2663,7 @@
case op_insert:
case op_update:
case op_delete:
- case op_output:
+ case op_ddl:
break;
case op_select:
@@ -2784,7 +2784,7 @@
case op_full:
case op_semi:
case op_anti:
- case op_output:
+ case op_ddl:
return rel;
}
return rel;
@@ -2812,7 +2812,7 @@
case op_insert:
case op_update:
case op_delete:
- case op_output:
+ case op_ddl:
return rel;
@@ -3306,7 +3306,7 @@
case op_select:
case op_groupby:
case op_topn:
- case op_output:
+ case op_ddl:
rel->l = rewrite(sql, rel->l, rewriter);
break;
case op_insert:
Index: sql_statement.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_statement.mx,v
retrieving revision 1.194
retrieving revision 1.195
diff -u -d -r1.194 -r1.195
--- sql_statement.mx 29 Nov 2009 09:32:22 -0000 1.194
+++ sql_statement.mx 13 Dec 2009 20:33:16 -0000 1.195
@@ -97,6 +97,7 @@
st_append,
st_table_clear,
st_exception,
+ st_trans,
st_append_col,
st_append_idx,
@@ -214,6 +215,8 @@
extern stmt *stmt_append(stmt *c, stmt *values);
extern stmt *stmt_table_clear(sql_table *t);
extern stmt *stmt_export(stmt *t, char *sep, char *rsep, char *ssep, char
*null_string, stmt *file);
+extern stmt *stmt_trans(int type, stmt *chain, stmt *name);
+
extern stmt *stmt_temp(sql_subtype *t);
extern stmt *stmt_atom(atom *op1);
extern stmt *stmt_atom_string(char *s);
@@ -388,6 +391,7 @@
ST(append);
ST(table_clear);
ST(exception);
+ ST(trans);
ST(append_col);
ST(append_idx);
@@ -635,6 +639,7 @@
case st_return:
case st_assign:
case st_exception:
+ case st_trans:
if (s->op1.stval)
stmt_destroy(s->op1.stval);
@@ -694,7 +699,6 @@
if (s->op2.lval)
list_destroy(s->op2.lval);
break;
-
case st_aggr:
if (s->op1.stval)
stmt_destroy(s->op1.stval);
@@ -917,6 +921,7 @@
case st_var:
case st_temp:
case st_atom:
+ case st_trans:
break;
/* special cases */
@@ -1840,6 +1845,17 @@
return s;
}
+stmt *
+stmt_trans(int type, stmt *chain, stmt *name)
+{
+ stmt *s = stmt_create(st_trans);
+
+ s->op1.stval = chain;
+ s->op2.stval = name;
+ s->flag = type;
+ return s;
+}
+
void
stmt_set_nrcols(stmt *s)
{
@@ -2728,6 +2744,7 @@
stmt_stmt2dot(s->op4.stval, l, i, fp),
-(s->optimized));
break;
+ case st_trans:
case st_atom:
case st_bat:
break;
@@ -2823,6 +2840,8 @@
case st_rs_column:
case st_export:
printf("export\n"); break;
+ case st_trans:
+ printf("trans\n"); break;
case st_affected_rows:
case st_while:
case st_if:
Index: rel_dump.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_dump.mx,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- rel_dump.mx 28 Nov 2009 22:56:47 -0000 1.43
+++ rel_dump.mx 13 Dec 2009 20:33:16 -0000 1.44
@@ -211,8 +211,8 @@
return "basetable";
case op_table:
return "table";
- case op_output:
- return "output";
+ case op_ddl:
+ return "ddl";
case op_project:
return "project";
case op_select:
@@ -287,10 +287,11 @@
if (rel->exps)
exps_print(sql, fout, rel->exps, depth, 1, 0);
break;
- case op_output:
+ case op_ddl:
print_indent(sql, fout, depth);
- stream_printf(fout, "output");
- rel_print_(sql, fout, rel->l, depth+1, refs);
+ stream_printf(fout, "ddl");
+ if (rel->l)
+ rel_print_(sql, fout, rel->l, depth+1, refs);
if (rel->exps)
exps_print(sql, fout, rel->exps, depth, 1, 0);
break;
@@ -414,7 +415,7 @@
switch (rel->op) {
case op_basetable:
case op_table:
- case op_output:
+ case op_ddl:
break;
case op_join:
case op_left:
Index: rel_semantic.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_semantic.mx,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- rel_semantic.mx 28 Nov 2009 22:56:47 -0000 1.41
+++ rel_semantic.mx 13 Dec 2009 20:33:16 -0000 1.42
@@ -47,6 +47,7 @@
#include "rel_semantic.h"
#include "rel_select.h"
#include "rel_updates.h"
+#include "rel_trans.h"
#include "rel_exp.h"
#include <unistd.h>
@@ -185,6 +186,7 @@
case TR_ROLLBACK:
case TR_START:
case TR_MODE:
+ return rel_transactions(sql, s);
case SQL_CREATE_SCHEMA:
case SQL_DROP_SCHEMA:
Index: sql_mvc.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_mvc.mx,v
retrieving revision 1.229
retrieving revision 1.230
diff -u -d -r1.229 -r1.230
--- sql_mvc.mx 28 Nov 2009 19:57:19 -0000 1.229
+++ sql_mvc.mx 13 Dec 2009 20:33:16 -0000 1.230
@@ -401,7 +401,7 @@
fprintf(stderr, "mvc_commit %s\n", (name) ? name : "");
if (m->session->status < 0) {
- GDKerror("COMMIT: transaction is aborted, will ROLLBACK
instead");
+ (void)sql_error(m, 010, "COMMIT: transaction is aborted, will
ROLLBACK instead");
mvc_rollback(m, chain, name);
return -1;
}
@@ -435,7 +435,7 @@
cur -> parent = tr;
tr = cur;
if (ok != SQL_OK) {
- GDKerror("COMMIT: transaction is aborted, will ROLLBACK
instead");
+ (void)sql_error(m, 010, "COMMIT: transaction is aborted, will
ROLLBACK instead");
mvc_rollback(m, chain, name);
return -1;
}
@@ -462,7 +462,7 @@
}
} else {
store_unlock();
- GDKerror("COMMIT: transaction is aborted because of concurency
conflicts, will ROLLBACK instead");
+ (void)sql_error(m, 010, "COMMIT: transaction is aborted because
of concurency conflicts, will ROLLBACK instead");
mvc_rollback(m, chain, name);
return -1;
}
@@ -498,7 +498,7 @@
while (tr && (!tr->name || strcmp(tr->name, name) != 0))
tr = tr->parent;
if (!tr) {
- GDKerror("rollback savepoint %s doesn't exists", name);
+ (void)sql_error(m, 010, "rollback savepoint %s doesn't
exists", name);
m->session->status = -1;
store_unlock();
return -1;
@@ -558,7 +558,7 @@
while (tr && (!tr->name || strcmp(tr->name, name) != 0))
tr = tr->parent;
if (!tr || !tr->name || strcmp(tr->name, name) != 0) {
- GDKerror("release savepoint %s doesn't exists", name);
+ (void)sql_error(m, 010, "release savepoint %s doesn't exists",
name);
m->session->status = -1;
return -1;
}
Index: sql_rel2bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_rel2bin.mx,v
retrieving revision 1.141
retrieving revision 1.142
diff -u -d -r1.141 -r1.142
--- sql_rel2bin.mx 28 Nov 2009 19:57:38 -0000 1.141
+++ sql_rel2bin.mx 13 Dec 2009 20:33:16 -0000 1.142
@@ -219,8 +219,8 @@
case st_affected_rows:
case st_export:
-
case st_exception:
+ case st_trans:
case st_while:
case st_if:
@@ -1202,6 +1202,7 @@
case st_column:
case st_append:
case st_exception:
+ case st_trans:
case st_aggr:
case st_unop:
Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.162
retrieving revision 1.163
diff -u -d -r1.162 -r1.163
--- rel_select.mx 4 Dec 2009 14:30:42 -0000 1.162
+++ rel_select.mx 13 Dec 2009 20:33:16 -0000 1.163
@@ -44,7 +44,6 @@
extern sql_rel *rel_basetable(sql_table *t, char *tname);
extern sql_rel *rel_recursive_func(list *exps);
extern sql_rel *rel_table_func(sql_exp *f, list *exps);
-extern sql_rel *rel_output(sql_rel *l, sql_exp *sep, sql_exp *rsep, sql_exp
*ssep, sql_exp *null_string, sql_exp *file);
extern sql_exp *rel_bind_column( mvc *sql, sql_rel *rel, char *cname, int f );
extern sql_exp *rel_bind_column2( mvc *sql, sql_rel *rel, char *tname, char
*cname, int f );
@@ -352,7 +351,7 @@
case op_update:
case op_delete:
break;
- case op_output:
+ case op_ddl:
break;
}
if (found)
@@ -522,28 +521,6 @@
}
sql_rel *
-rel_output(sql_rel *l, sql_exp *sep, sql_exp *rsep, sql_exp *ssep, sql_exp
*null_string, sql_exp *file)
-{
- sql_rel *rel = rel_create();
- list *exps = new_exp_list();
-
- append(exps, sep);
- append(exps, rsep);
- append(exps, ssep);
- append(exps, null_string);
- if (file)
- append(exps, file);
- rel->l = l;
- rel->r = NULL;
- rel->op = op_output;
- rel->exps = exps;
- rel->card = 0;
- rel->nrcols = 0;
- return rel;
-}
-
-
-sql_rel *
rel_recursive_func(list *exps)
{
sql_rel *rel = rel_create();
Index: Makefile.ag
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/Makefile.ag,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -d -r1.80 -r1.81
--- Makefile.ag 28 Nov 2009 22:56:46 -0000 1.80
+++ Makefile.ag 13 Dec 2009 20:33:16 -0000 1.81
@@ -62,6 +62,7 @@
rel_semantic.mx \
rel_select.mx \
rel_updates.mx \
+ rel_trans.mx \
rel_subquery.mx \
rel_prop.mx \
rel_exp.mx \
Index: rel_updates.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_updates.mx,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- rel_updates.mx 28 Nov 2009 22:56:47 -0000 1.11
+++ rel_updates.mx 13 Dec 2009 20:33:16 -0000 1.12
@@ -652,6 +652,27 @@
return res;
}
+static sql_rel *
+rel_output(sql_rel *l, sql_exp *sep, sql_exp *rsep, sql_exp *ssep, sql_exp
*null_string, sql_exp *file)
+{
+ sql_rel *rel = rel_create();
+ list *exps = new_exp_list();
+
+ append(exps, sep);
+ append(exps, rsep);
+ append(exps, ssep);
+ append(exps, null_string);
+ if (file)
+ append(exps, file);
+ rel->l = l;
+ rel->r = NULL;
+ rel->op = op_ddl;
+ rel->flag = DDL_OUTPUT;
+ rel->exps = exps;
+ rel->card = 0;
+ rel->nrcols = 0;
+ return rel;
+}
static sql_rel *
copyto(mvc *sql, symbol *sq, str filename, dlist *seps, str null_string)
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -d -r1.103 -r1.104
--- rel_bin.mx 29 Nov 2009 15:57:03 -0000 1.103
+++ rel_bin.mx 13 Dec 2009 20:33:16 -0000 1.104
@@ -3433,6 +3433,72 @@
return NULL;
}
+#define E_ATOM_INT(e) ((atom*)((sql_exp*)e)->l)->data.val.lval
+#define E_ATOM_STRING(e) ((atom*)((sql_exp*)e)->l)->data.val.sval
+
+static stmt *
+rel2bin_output(mvc *sql, sql_rel *rel, list *refs)
+{
+ node *n = rel->exps->h;
+ char *tsep = _strdup(E_ATOM_STRING(n->data));
+ char *rsep = _strdup(E_ATOM_STRING(n->next->data));
+ char *ssep = _strdup(E_ATOM_STRING(n->next->next->data));
+ char *ns = _strdup(E_ATOM_STRING(n->next->next->next->data));
+ char *fn = NULL;
+ stmt *s = NULL, *fns = NULL;
+ list *slist = create_stmt_list();
+
+ if (rel->l) /* first construct the sub relation */
+ s = subrel_bin(sql, rel->l, refs);
+ if (!s)
+ return NULL;
+
+ if (n->next->next->next->next) {
+ fn = E_ATOM_STRING(n->next->next->next->next->data);
+ fns = stmt_atom_string(_strdup(fn));
+ }
+ list_append(slist, stmt_export(s, tsep, rsep, ssep, ns, fns));
+ if (s->type == st_list && ((stmt*)s->op1.lval->h->data)->nrcols != 0) {
+ stmt *cnt = stmt_aggr(stmt_dup(s->op1.lval->h->data), NULL,
sql_bind_aggr(sql->session->schema, "count", NULL), 1);
+ list_append(slist, stmt_affected_rows(cnt));
+ } else {
+ list_append(slist, stmt_affected_rows(stmt_atom_wrd(1)));
+ }
+ s = stmt_list(slist);
+ return s;
+}
+
+static stmt *
+rel2bin_trans(mvc *sql, sql_rel *rel, list *refs)
+{
+ node *en = rel->exps->h;
+ stmt *chain = exp_bin(sql, en->data, NULL, NULL, NULL, NULL);
+ stmt *name = NULL;
+
+ (void)refs;
+ if (en->next)
+ name = exp_bin(sql, en->next->data, NULL, NULL, NULL, NULL);
+ return stmt_trans(rel->flag, chain, name);
+}
+
+static stmt *
+rel2bin_ddl(mvc *sql, sql_rel *rel, list *refs)
+{
+ stmt *s = NULL;
+
+ if (rel->flag == DDL_OUTPUT) {
+ s = rel2bin_output(sql, rel, refs);
+ sql->type = Q_TABLE;
+ } else if (rel->flag <= DDL_TRANS) {
+ s = rel2bin_trans(sql, rel, refs);
+ sql->type = Q_TRANS;
+ } else {
+ sql->type = Q_SCHEMA;
+ return NULL;
+ }
+ return s;
+}
+
static stmt *
subrel_bin(mvc *sql, sql_rel *rel, list *refs)
{
@@ -3510,8 +3576,8 @@
s = rel2bin_delete(sql, rel, refs);
sql->type = Q_UPDATE;
break;
- case op_output:
- assert(0);
+ case op_ddl:
+ s = rel2bin_ddl(sql, rel, refs);
break;
}
if (s && rel_is_ref(rel)) {
@@ -3541,44 +3607,14 @@
return s;
}
-#define E_ATOM_STRING(e) ((atom*)((sql_exp*)e)->l)->data.val.sval
-
stmt *
output_rel_bin(mvc *sql, sql_rel *rel )
{
- sql_rel *p = rel;
list *refs = list_create(NULL);
- stmt *s = NULL;
-
- if (is_output(p->op))
- rel = p->l;
- s = subrel_bin( sql, rel, refs);
-
- if (s && p != rel) {
- node *n = p->exps->h;
- char *tsep = _strdup(E_ATOM_STRING(n->data));
- char *rsep = _strdup(E_ATOM_STRING(n->next->data));
- char *ssep = _strdup(E_ATOM_STRING(n->next->next->data));
- char *ns = _strdup(E_ATOM_STRING(n->next->next->next->data));
- char *fn = NULL;
- stmt *fns = NULL;
- list *slist = create_stmt_list();
+ stmt *s = subrel_bin( sql, rel, refs);
- if (n->next->next->next->next) {
- fn = E_ATOM_STRING(n->next->next->next->next->data);
- fns = stmt_atom_string(_strdup(fn));
- }
- list_append(slist, stmt_export(s, tsep, rsep, ssep, ns, fns));
- if (s->type == st_list && ((stmt*)s->op1.lval->h->data)->nrcols
!= 0) {
- stmt *cnt = stmt_aggr(stmt_dup(s->op1.lval->h->data),
NULL, sql_bind_aggr(sql->session->schema, "count", NULL), 1);
- list_append(slist, stmt_affected_rows(cnt));
- } else {
- list_append(slist,
stmt_affected_rows(stmt_atom_wrd(1)));
- }
- s = stmt_list(slist);
- } else if (s && s->type != st_none && sql->type == Q_TABLE) {
+ if (!is_ddl(rel->op) && s && s->type != st_none && sql->type == Q_TABLE)
s = stmt_output(s);
- }
list_destroy(refs);
return s;
}
------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins