Changeset: 16d6c58f172a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/16d6c58f172a Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_execute.c Branch: default Log Message:
Merge with Jul2021 branch. diffs (162 lines): diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -1924,7 +1924,7 @@ exp2bin_args(backend *be, sql_exp *e, li stpcpy(stpcpy(stpcpy(stpcpy(buf, levelstr), "\""), nme), "\""); /* escape variable name */ } if (!list_find(args, buf, (fcmp)&alias_cmp)) { - stmt *s = stmt_var(be, vname->sname, vname->name, &e->tpe, 0, 0); + stmt *s = stmt_var(be, vname->sname, vname->name, &e->tpe, 0, e->flag); s = stmt_alias(be, s, NULL, sa_strdup(sql->sa, buf)); list_append(args, s); diff --git a/sql/backends/monet5/sql_execute.c b/sql/backends/monet5/sql_execute.c --- a/sql/backends/monet5/sql_execute.c +++ b/sql/backends/monet5/sql_execute.c @@ -805,17 +805,6 @@ RAstatement(Client c, MalBlkPtr mb, MalS return RAcommit_statement(be, msg); } -static int -is_a_number(char *v) -{ - while(*v) { - if (!isdigit((unsigned char) *v)) - return 0; - v++; - } - return 1; -} - static char * parseIdent(char *in, char *out) { @@ -860,62 +849,70 @@ RAstatement2(Client cntxt, MalBlkPtr mb, if (!stack_push_frame(m, NULL)) return RAcommit_statement(be, createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL)); ops = sa_list(m->sa); - while (sig && *sig && !isspace((unsigned char) *sig)) { - char *vnme = sig, *tnme, *nbuf, *sch, *var; - char *p = strchr(++sig, (int)' '); - int d,s,nr = -1; + while (sig && *sig) { + sql_schema *sh = NULL; sql_type *t = NULL; sql_subtype tpe; + char *p, *vtype = NULL, *sch = NULL, *var = NULL; + int d, s, level = strtol(sig, &p, 10); - *p++ = 0; - /* vnme can be name or number */ - if (is_a_number(vnme+1)) - nr = strtol(vnme+1, NULL, 10); - tnme = p; - p = strchr(p, (int)'('); - *p++ = 0; - tnme = sa_strdup(m->sa, tnme); + var = p+1; + assert(*p == '"'); + p = parseIdent(p+1, var); + assert(*p == '\0'); + p++; + if (*p == '"') { /* global variable, parse schema and name */ + sch = var; + var = p+1; + p = parseIdent(p+1, var); + assert(*p == '\0'); + p++; + } + + assert(*p == ' '); + p++; /* skip space and get type */ + vtype = p; + p = strchr(p, '('); + *p++ = '\0'; + + /* get digits and scale */ d = strtol(p, &p, 10); p++; /* skip , */ s = strtol(p, &p, 10); + p+=2; /* skip ) and , or ' ' */ + sig = p; - if (!sql_find_subtype(&tpe, tnme, d, s)) { - if (!(t = mvc_bind_type(m, tnme))) { /* try an external type */ + if (!sql_find_subtype(&tpe, vtype, d, s)) { + if (!(t = mvc_bind_type(m, vtype))) { /* try an external type */ stack_pop_frame(m); - return RAcommit_statement(be, createException(SQL,"RAstatement2",SQLSTATE(42000) "SQL type %s(%d, %d) not found\n", tnme, d, s)); + return RAcommit_statement(be, createException(SQL,"RAstatement2",SQLSTATE(42000) "SQL type %s(%d, %d) not found\n", vtype, d, s)); } sql_init_subtype(&tpe, t, d, s); } - if (nr >= 0) { - list_append(ops, exp_atom_ref(m->sa, nr, &tpe)); - } else { - sql_schema *s; - - while (*vnme && isdigit(*vnme)) /* skip digit characters */ - vnme++; - - nbuf = vnme; - sch = nbuf+1; - assert(*nbuf == '"'); - nbuf = parseIdent(nbuf+1, sch); - assert(*nbuf == '\0'); - var = nbuf+2; - nbuf = parseIdent(nbuf+2, var); - - if (!(s = mvc_bind_schema(m, sch))) { + if (sch) { + assert(level == 0); + if (!(sh = mvc_bind_schema(m, sch))) { stack_pop_frame(m); return RAcommit_statement(be, createException(SQL,"RAstatement2",SQLSTATE(3F000) "No such schema '%s'", sch)); } - if (!find_global_var(m, s, var) && !push_global_var(m, sch, var, &tpe)) { + if (!find_global_var(m, sh, var) && !push_global_var(m, sch, var, &tpe)) { stack_pop_frame(m); return RAcommit_statement(be, createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL)); } list_append(ops, exp_var(m->sa, sa_strdup(m->sa, sch), sa_strdup(m->sa, var), &tpe, 0)); + } else { + char opname[BUFSIZ]; + + level = 1; /* TODO multiple levels */ + if (!frame_push_var(m, var, &tpe)) { + stack_pop_frame(m); + return RAcommit_statement(be, createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL)); + } + + snprintf(opname, BUFSIZ, "%d%%%s", level, var); /* engineering trick */ + list_append(ops, exp_var(m->sa, NULL, sa_strdup(m->sa, opname), &tpe, level)); } - sig = strchr(p, (int)','); - if (sig) - sig++; } refs = sa_list(m->sa); rel = rel_read(m, expr, &pos, refs); diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py b/sql/test/SQLancer/Tests/sqlancer19.SQL.py --- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py +++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py @@ -100,6 +100,18 @@ with SQLTestCase() as cli: .assertSucceeded().assertDataResultMatch([(1,),(2,),(2,),(2,),(2,),(5,),(5,),(5,),(5,),(7,)]) cli.execute("SELECT rt3.c0 FROM rt3 INNER JOIN rt3 myx ON rt3.c0 = myx.c0 ORDER BY rt3.c0;") \ .assertSucceeded().assertDataResultMatch([(1,),(2,),(2,),(2,),(2,),(5,),(5,),(5,),(5,),(7,)]) + cli.execute(""" + CREATE FUNCTION testremote(a int) RETURNS INT + BEGIN + DECLARE b INT, "😀" INT, res1 INT, res2 INT; + SET b = 2; + SET "😀" = 4; + SELECT a + b + "😀" + count(*) INTO res1 FROM t3; + SELECT a + b + "😀" + count(*) INTO res2 FROM rt3; + RETURN res1 + res2; + END; + """).assertSucceeded() + cli.execute("SELECT testremote(1);").assertSucceeded().assertDataResultMatch([(26,)]) # Issues related to digits and scale propagation in the sql layer cli.execute("SELECT CAST(2 AS DECIMAL) & CAST(3 AS DOUBLE) FROM t3 where t3.c0 = 1;") \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list