Changeset: 52698c5b3916 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=52698c5b3916
Branch: default
Log Message:
Merge with Oct2020 branch.
diffs (167 lines):
diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -342,20 +342,41 @@ dlist2string(mvc *sql, dlist *l, int exp
return b;
}
+static const char *
+symbol_escape_ident(sql_allocator *sa, const char *s)
+{
+ char *res = NULL;
+ if (s) {
+ size_t l = strlen(s);
+ char *r = SA_NEW_ARRAY(sa, char, (l * 2) + 1);
+
+ res = r;
+ while (*s) {
+ if (*s == '"')
+ *r++ = '"';
+ *r++ = *s++;
+ }
+ *r = '\0';
+ }
+ return res;
+}
+
char *
-_symbol2string(mvc *sql, symbol *se, int expression, char **err) /**/
+_symbol2string(mvc *sql, symbol *se, int expression, char **err)
{
/* inner symbol2string uses the temporary allocator */
switch (se->token) {
case SQL_NOP: {
dnode *lst = se->data.lval->h, *ops =
lst->next->next->data.lval->h, *aux;
- const char *op = qname_schema_object(lst->data.lval), *sname =
qname_schema(lst->data.lval);
+ const char *op = symbol_escape_ident(sql->ta,
qname_schema_object(lst->data.lval)),
+ *sname = qname_schema(lst->data.lval);
int i = 0, nargs = 0;
char** inputs = NULL, *res;
size_t inputs_length = 0;
if (!sname)
sname = sql->session->schema->base.name;
+ sname = symbol_escape_ident(sql->ta, sname);
for (aux = ops; aux; aux = aux->next)
nargs++;
@@ -385,11 +406,14 @@ char *
} break;
case SQL_BINOP: {
dnode *lst = se->data.lval->h;
- const char *op = qname_schema_object(lst->data.lval), *sname =
qname_schema(lst->data.lval);
+ const char *op = symbol_escape_ident(sql->ta,
qname_schema_object(lst->data.lval)),
+ *sname = qname_schema(lst->data.lval);
char *l = NULL, *r = NULL, *res;
if (!sname)
sname = sql->session->schema->base.name;
+ sname = symbol_escape_ident(sql->ta, sname);
+
if (!(l = _symbol2string(sql, lst->next->next->data.sym,
expression, err)) || !(r = _symbol2string(sql, lst->next->next->next->data.sym,
expression, err)))
return NULL;
@@ -400,11 +424,13 @@ char *
} break;
case SQL_OP: {
dnode *lst = se->data.lval->h;
- const char *op = qname_schema_object(lst->data.lval), *sname =
qname_schema(lst->data.lval);
+ const char *op = symbol_escape_ident(sql->ta,
qname_schema_object(lst->data.lval)),
+ *sname = qname_schema(lst->data.lval);
char *res;
if (!sname)
sname = sql->session->schema->base.name;
+ sname = symbol_escape_ident(sql->ta, sname);
if ((res = SA_NEW_ARRAY(sql->ta, char, strlen(sname) +
strlen(op) + 8)))
stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "\""), sname),
"\".\""), op), "\"()");
@@ -413,11 +439,13 @@ char *
} break;
case SQL_UNOP: {
dnode *lst = se->data.lval->h;
- const char *op = qname_schema_object(lst->data.lval), *sname =
qname_schema(lst->data.lval);
+ const char *op = symbol_escape_ident(sql->ta,
qname_schema_object(lst->data.lval)),
+ *sname = qname_schema(lst->data.lval);
char *l = _symbol2string(sql, lst->next->next->data.sym,
expression, err), *res;
if (!sname)
sname = sql->session->schema->base.name;
+ sname = symbol_escape_ident(sql->ta, sname);
if (!l)
return NULL;
@@ -438,11 +466,13 @@ char *
return sa_strdup(sql->ta, "NULL");
}
case SQL_NEXT: {
- const char *seq = qname_schema_object(se->data.lval), *sname =
qname_schema(se->data.lval);
+ const char *seq = symbol_escape_ident(sql->ta,
qname_schema_object(se->data.lval)),
+ *sname = qname_schema(se->data.lval);
char *res;
if (!sname)
sname = sql->session->schema->base.name;
+ sname = symbol_escape_ident(sql->ta, sname);
if ((res = SA_NEW_ARRAY(sql->ta, char, strlen("next value for
\"") + strlen(sname) + strlen(seq) + 5)))
stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "next value for
\""), sname), "\".\""), seq), "\"");
@@ -455,14 +485,16 @@ char *
assert(l->h->type != type_lng);
if (expression && dlist_length(l) == 1 && l->h->type ==
type_string) {
/* when compiling an expression, a column of a table
might be present in the symbol, so we need this case */
- const char *op = l->h->data.sval;
+ const char *op = symbol_escape_ident(sql->ta,
l->h->data.sval);
char *res;
if ((res = SA_NEW_ARRAY(sql->ta, char, strlen(op) + 3)))
stpcpy(stpcpy(stpcpy(res, "\""), op), "\"");
return res;
} else if (expression && dlist_length(l) == 2 && l->h->type ==
type_string && l->h->next->type == type_string) {
- char *first = l->h->data.sval, *second =
l->h->next->data.sval, *res;
+ const char *first = symbol_escape_ident(sql->ta,
l->h->data.sval),
+ *second =
symbol_escape_ident(sql->ta, l->h->next->data.sval);
+ char *res;
if (!first || !second)
return NULL;
diff --git
a/sql/test/BugTracker-2020/Tests/drop-table-with-auto_increment.Bug-7030.sql
b/sql/test/BugTracker-2020/Tests/drop-table-with-auto_increment.Bug-7030.sql
--- a/sql/test/BugTracker-2020/Tests/drop-table-with-auto_increment.Bug-7030.sql
+++ b/sql/test/BugTracker-2020/Tests/drop-table-with-auto_increment.Bug-7030.sql
@@ -6,6 +6,14 @@ create table s1.t (i int not null auto_i
drop table s1.t;
drop schema s1;
+create schema "a""a";
+create table "a""a"."nasty"(a int auto_increment);
+insert into "a""a"."nasty";
+select a from "a""a"."nasty";
+ -- 1
+drop table "a""a"."nasty";
+drop schema "a""a";
+
select cast(count(*) - (select "a" from "depend_count") as bigint) from
dependencies, sequences;
-- the number of dependencies and sequences shouldn't increase
drop table "depend_count";
diff --git
a/sql/test/BugTracker-2020/Tests/drop-table-with-auto_increment.Bug-7030.stable.out
b/sql/test/BugTracker-2020/Tests/drop-table-with-auto_increment.Bug-7030.stable.out
---
a/sql/test/BugTracker-2020/Tests/drop-table-with-auto_increment.Bug-7030.stable.out
+++
b/sql/test/BugTracker-2020/Tests/drop-table-with-auto_increment.Bug-7030.stable.out
@@ -12,6 +12,18 @@ stdout of test 'drop-table-with-auto_inc
#create table s1.t (i int not null auto_increment);
#drop table s1.t;
#drop schema s1;
+#create schema "a""a";
+#create table "a""a"."nasty"(a int auto_increment);
+#insert into "a""a"."nasty";
+[ 1 ]
+#select a from "a""a"."nasty";
+% a\"a.nasty # table_name
+% a # name
+% int # type
+% 1 # length
+[ 1 ]
+#drop table "a""a"."nasty";
+#drop schema "a""a";
#select cast(count(*) - (select "a" from "depend_count") as bigint) from
dependencies, sequences;
% .%3 # table_name
% %3 # name
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list