Changeset: 5aa1c0ab39a2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5aa1c0ab39a2
Modified Files:
sql/server/rel_dump.c
sql/storage/store.c
sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
sql/test/BugTracker-2009/Tests/use_order_column_first.SF-2686008.stable.out
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out
sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out
sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
sql/test/BugTracker-2013/Tests/rangejoin_optimizer.Bug-3411.stable.out
sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
sql/test/BugTracker-2015/Tests/large_join.Bug-3809.stable.out
sql/test/BugTracker-2015/Tests/quantile_function_resolution.Bug-3773.stable.out
sql/test/BugTracker-2015/Tests/schema_view.Bug-3708.stable.out
sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out
sql/test/BugTracker-2016/Tests/merge_project.Bug-3955.stable.out
sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
sql/test/Tests/order_by_complex_exp.stable.out
sql/test/leaks/Tests/check1.stable.out.int128
sql/test/mergetables/Tests/part-elim.stable.out
Branch: Dec2016
Log Message:
quote identifiers in relational plan output (also used for shipping remote
queries). Fixes problems with quoted identifiers in remote columns.
diffs (truncated from 1986 to 300 lines):
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -157,8 +157,8 @@ exp_print(mvc *sql, stream *fout, sql_ex
} break;
case e_column:
if (e->l)
- mnstr_printf(fout, "%s.", (char*)e->l);
- mnstr_printf(fout, "%s", (char*)e->r);
+ mnstr_printf(fout, "\"%s\".", (char*)e->l);
+ mnstr_printf(fout, "\"%s\"", (char*)e->r);
if (e->rname && e->name && e->l && e->r &&
strcmp(e->rname, e->l) == 0 &&
strcmp(e->name, e->r) == 0)
@@ -224,8 +224,8 @@ exp_print(mvc *sql, stream *fout, sql_ex
if (e->name && alias) {
mnstr_printf(fout, " as ");
if (e->rname)
- mnstr_printf(fout, "%s.", e->rname);
- mnstr_printf(fout, "%s", e->name);
+ mnstr_printf(fout, "\"%s\".", e->rname);
+ mnstr_printf(fout, "\"%s\"", e->name);
}
if (comma)
mnstr_printf(fout, ", ");
@@ -588,13 +588,22 @@ skipWS( char *r, int *pos)
static void
skipIdent( char *r, int *pos)
{
- while(r[*pos] && (isalnum(r[*pos]) || r[*pos] == '_' || r[*pos] == '%'))
+ if (r[*pos] == '"') {
(*pos)++;
+ while(r[*pos] && r[*pos] != '"')
+ (*pos)++;
+ (*pos)++;
+ } else {
+ while(r[*pos] && (isalnum(r[*pos]) || r[*pos] == '_' || r[*pos]
== '%'))
+ (*pos)++;
+ }
}
static void
skipIdentOrSymbol( char *r, int *pos)
{
+ if (r[*pos] == '"')
+ return skipIdent(r, pos);
while(r[*pos] && (isalnum(r[*pos]) ||
r[*pos] == '_' || r[*pos] == '%' ||
r[*pos] == '<' || r[*pos] == '>' ||
@@ -720,30 +729,32 @@ static sql_exp*
exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *pexps, char *r, int
*pos, int grp)
{
int f = -1;
- int not = 1, old, d=0, s=0, unique = 0, no_nils = 0;
+ int not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0;
char *tname, *cname = NULL, *e, *b = r + *pos, *st;
sql_exp *exp = NULL;
list *exps = NULL;
sql_subtype *tpe;
+ quote = (r[*pos] == '"');
+ b += quote;
skipIdent(r, pos);
- e = r+*pos;
+ e = r+*pos-quote;
skipWS(r, pos);
switch(r[*pos]) {
- /* ident */
case '.':
*e = 0;
(*pos)++;
tname = b;
- cname = r + *pos;
+ cname = r + *pos + quote;
skipIdentOrSymbol(r, pos);
- e = r+*pos;
- skipWS(r, pos);
+ e = r+*pos - quote;
old = *e;
*e = 0;
tname = sa_strdup(sql->sa, tname);
cname = sa_strdup(sql->sa, cname);
+ *e = old;
+ skipWS(r, pos);
if (pexps)
exp = exps_bind_column2(pexps, tname, cname);
if (!exp && lrel) {
@@ -753,7 +764,6 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
} else if (!exp) {
exp = exp_column(sql->sa, tname, cname, NULL,
CARD_ATOM, 1, (strchr(cname,'%') != NULL));
}
- *e = old;
break;
/* atom */
case '(':
@@ -942,30 +952,25 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
/* as alias */
if (strncmp(r+*pos, "as", 2) == 0) {
- int old;
(*pos)+=2;
skipWS(r, pos);
- tname = r+*pos;
+ tname = r+*pos+1;
skipIdent(r, pos);
if (r[*pos] != '.') {
- old = r[*pos];
- r[*pos] = 0;
+ r[*pos-1] = 0;
cname = tname;
exp_setname(sql->sa, exp, NULL, cname);
- r[*pos] = old;
skipWS(r, pos);
} else {
- r[*pos] = 0;
+ r[*pos-1] = 0;
(*pos)++;
- cname = r+*pos;
+ cname = r+*pos+1;
skipIdent(r, pos);
- e = r+*pos;
+ e = r+*pos-1;
skipWS(r, pos);
- old = *e;
*e = 0;
exp_setname(sql->sa, exp, tname, cname);
- *e = old;
}
}
skipWS(r, pos);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3406,6 +3406,7 @@ reset_table(sql_trans *tr, sql_table *ft
ft->base.wtime = ft->base.rtime = 0;
ft->cleared = 0;
+ ft->access = pft->access;
ok = reset_changeset( tr, &ft->columns, &pft->columns,
&ft->base, (resetf) &reset_column, (dupfunc) &column_dup);
if (ok == LOG_OK)
ok = reset_changeset( tr, &ft->idxs, &pft->idxs,
&ft->base, (resetf) &reset_idx, (dupfunc) &idx_dup);
@@ -3413,6 +3414,7 @@ reset_table(sql_trans *tr, sql_table *ft
ok = reset_changeset( tr, &ft->keys, &pft->keys,
&ft->base, (resetf) NULL, (dupfunc) &key_dup);
if (ok == LOG_OK)
ok = reset_changeset( tr, &ft->triggers,
&pft->triggers, &ft->base, (resetf) NULL, (dupfunc) &trigger_dup);
+ /* TODO reset_tables of tables */
return ok;
}
return LOG_OK;
diff --git
a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
--- a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
+++ b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
@@ -28,12 +28,12 @@ Ready.
% .plan # table_name
% rel # name
% clob # type
-% 196 # length
+% 200 # length
insert(
-| table(sys.cm_tmp) [ cm_tmp.i, cm_tmp.%TID% NOT NULL ]
+| table(sys.cm_tmp) [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL ]
| union (
-| | table sys.copyfrom(table(cm_tmp), varchar "|", varchar "\n", varchar
"NULL", varchar "null", varchar "/file1", bigint "-1", bigint "0", int "0", int
"0", varchar "NULL"), [ cm_tmp.i ] COUNT ,
-| | table sys.copyfrom(table(cm_tmp), varchar "|", varchar "\n", varchar
"NULL", varchar "null", varchar "/file2", bigint "-1", bigint "0", int "0", int
"0", varchar "NULL"), [ cm_tmp.i ] COUNT
+| | table sys.copyfrom(table(cm_tmp), varchar "|", varchar "\n", varchar
"NULL", varchar "null", varchar "/file1", bigint "-1", bigint "0", int "0", int
"0", varchar "NULL"), [ "cm_tmp"."i" ] COUNT ,
+| | table sys.copyfrom(table(cm_tmp), varchar "|", varchar "\n", varchar
"NULL", varchar "null", varchar "/file2", bigint "-1", bigint "0", int "0", int
"0", varchar "NULL"), [ "cm_tmp"."i" ] COUNT
| ) [ int "NULL" ]
)
diff --git
a/sql/test/BugTracker-2009/Tests/use_order_column_first.SF-2686008.stable.out
b/sql/test/BugTracker-2009/Tests/use_order_column_first.SF-2686008.stable.out
---
a/sql/test/BugTracker-2009/Tests/use_order_column_first.SF-2686008.stable.out
+++
b/sql/test/BugTracker-2009/Tests/use_order_column_first.SF-2686008.stable.out
@@ -81,21 +81,24 @@ Ready.
% .plan # table_name
% rel # name
% clob # type
-% 51 # length
+% 65 # length
project (
| group by (
-| | table(sys.sorted) [ sorted.a, sorted.b ] COUNT
-| ) [ sorted.a, sorted.b ] [ sorted.a, sorted.b ]
-) [ sorted.a, sorted.b ]
+| | table(sys.sorted) [ "sorted"."a", "sorted"."b" ] COUNT
+| ) [ "sorted"."a", "sorted"."b" ] [ "sorted"."a", "sorted"."b" ]
+) [ "sorted"."a", "sorted"."b" ]
+#plan select a,b from sorted group by b,a;
% .plan # table_name
% rel # name
% clob # type
-% 51 # length
+% 65 # length
project (
| group by (
-| | table(sys.sorted) [ sorted.a, sorted.b ] COUNT
-| ) [ sorted.b, sorted.a ] [ sorted.b, sorted.a ]
-) [ sorted.a, sorted.b ]
+| | table(sys.sorted) [ "sorted"."a", "sorted"."b" ] COUNT
+| ) [ "sorted"."b", "sorted"."a" ] [ "sorted"."b", "sorted"."a" ]
+) [ "sorted"."a", "sorted"."b" ]
+#drop table unsorted;
+#drop table sorted;
# 13:59:55 >
# 13:59:55 > Done.
diff --git
a/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
b/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
--- a/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
+++ b/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
@@ -32,97 +32,97 @@ Ready.
% .plan # table_name
% rel # name
% clob # type
-% 35 # length
+% 39 # length
project (
-| table(sys.oblo) [ oblo.a ] COUNT
-) [ oblo.a ]
+| table(sys.oblo) [ "oblo"."a" ] COUNT
+) [ "oblo"."a" ]
#PLAN select * from oblo OFFSET 2;
% .plan # table_name
% rel # name
% clob # type
-% 37 # length
+% 41 # length
top N (
| project (
-| | table(sys.oblo) [ oblo.a ] COUNT
-| ) [ oblo.a ]
+| | table(sys.oblo) [ "oblo"."a" ] COUNT
+| ) [ "oblo"."a" ]
) [ bigint "2" ]
#PLAN select * from oblo LIMIT 2;
% .plan # table_name
% rel # name
% clob # type
-% 37 # length
+% 41 # length
top N (
| project (
-| | table(sys.oblo) [ oblo.a ] COUNT
-| ) [ oblo.a ]
+| | table(sys.oblo) [ "oblo"."a" ] COUNT
+| ) [ "oblo"."a" ]
) [ bigint "2" ]
#PLAN select * from oblo LIMIT 1 OFFSET 2;
% .plan # table_name
% rel # name
% clob # type
-% 37 # length
+% 41 # length
top N (
| project (
-| | table(sys.oblo) [ oblo.a ] COUNT
-| ) [ oblo.a ]
+| | table(sys.oblo) [ "oblo"."a" ] COUNT
+| ) [ "oblo"."a" ]
) [ bigint "1", bigint "2" ]
#PLAN select * from oblo LIMIT 2 OFFSET 1;
% .plan # table_name
% rel # name
% clob # type
-% 37 # length
+% 41 # length
top N (
| project (
-| | table(sys.oblo) [ oblo.a ] COUNT
-| ) [ oblo.a ]
+| | table(sys.oblo) [ "oblo"."a" ] COUNT
+| ) [ "oblo"."a" ]
) [ bigint "2", bigint "1" ]
#PLAN select * from oblo ORDER BY a;
% .plan # table_name
% rel # name
% clob # type
-% 35 # length
+% 39 # length
project (
-| table(sys.oblo) [ oblo.a ] COUNT
-) [ oblo.a ] [ oblo.a ASC ]
+| table(sys.oblo) [ "oblo"."a" ] COUNT
+) [ "oblo"."a" ] [ "oblo"."a" ASC ]
#PLAN select * from oblo ORDER BY a OFFSET 2;
% .plan # table_name
% rel # name
% clob # type
-% 37 # length
+% 41 # length
top N (
| project (
-| | table(sys.oblo) [ oblo.a ] COUNT
-| ) [ oblo.a ] [ oblo.a ASC ]
+| | table(sys.oblo) [ "oblo"."a" ] COUNT
+| ) [ "oblo"."a" ] [ "oblo"."a" ASC ]
) [ bigint "2" ]
#PLAN select * from oblo ORDER BY a LIMIT 2;
% .plan # table_name
% rel # name
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list