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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list