MonetDB: pushdown - merged
Changeset: 2614f8097372 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2614f8097372 Modified Files: sql/server/rel_updates.c sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err sql/test/subquery/Tests/subquery4.stable.out Branch: pushdown Log Message: merged diffs (163 lines): diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -910,16 +910,10 @@ rel_update(mvc *sql, sql_rel *t, sql_rel static sql_exp * update_check_column(mvc *sql, sql_table *t, sql_column *c, sql_exp *v, sql_rel *r, char *cname, const char *action) { - if (!c) { - rel_destroy(r); - return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, cname); - } if (!table_privs(sql, t, PRIV_UPDATE) && !sql_privilege(sql, sql->user_id, c->base.id, PRIV_UPDATE)) return sql_error(sql, 02, SQLSTATE(42000) "%s: insufficient privileges for user '%s' to update table '%s' on column '%s'", action, stack_get_string(sql, "current_user"), t->base.name, cname); - if (!v || (v = rel_check_type(sql, &c->type, r, v, type_equal)) == NULL) { - rel_destroy(r); + if (!v || (v = rel_check_type(sql, &c->type, r, v, type_equal)) == NULL) return NULL; - } return v; } @@ -964,6 +958,9 @@ update_generate_assignments(sql_query *q if (single && a->token == SQL_DEFAULT) { char *colname = assignment->h->next->data.sval; sql_column *col = mvc_bind_column(sql, t, colname); + + if (!col) + return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, colname); if (col->def) { char *typestr = subtype2string2(&col->type); if (!typestr) @@ -1019,6 +1016,10 @@ update_generate_assignments(sql_query *q sql_column *c = mvc_bind_column(sql, t, cname); sql_exp *v = n->data; + if (!c) + return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, cname); + if (updates[c->colnr]) + return sql_error(sql, 02, SQLSTATE(42000) "%s: Multiple assignments to same column '%s'", action, c->base.name); if (mt && pcols) { for (node *nn = pcols->h; nn; nn = n->next) { int next = *(int*) nn->data; @@ -1035,13 +1036,11 @@ update_generate_assignments(sql_query *q exp_label(sql->sa, v, ++sql->label); if (!exp_is_atom(v) || outer) v = exp_ref(sql->sa, v); - if (!v) { /* check for NULL */ + if (!v) /* check for NULL */ v = exp_atom(sql->sa, atom_general(sql->sa, &c->type, NULL)); - } else if ((v = update_check_column(sql, t, c, v, r, cname, action)) == NULL) { + if (!(v = update_check_column(sql, t, c, v, r, cname, action))) return NULL; - } list_append(exps, exp_column(sql->sa, t->base.name, cname, &c->type, CARD_MULTI, 0, 0)); - assert(!updates[c->colnr]); exp_setname(sql->sa, v, c->t->base.name, c->base.name); updates[c->colnr] = v; } @@ -1049,6 +1048,10 @@ update_generate_assignments(sql_query *q char *cname = assignment->h->next->data.sval; sql_column *c = mvc_bind_column(sql, t, cname); + if (!c) + return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, cname); + if (updates[c->colnr]) + return sql_error(sql, 02, SQLSTATE(42000) "%s: Multiple assignments to same column '%s'", action, c->base.name); if (mt && pcols) { for (node *nn = pcols->h; nn; nn = nn->next) { int next = *(int*) nn->data; @@ -1061,11 +1064,10 @@ update_generate_assignments(sql_query *q } }
MonetDB: linear-hashing - Changed calculation of new BAT size du...
Changeset: f203d48e2455 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f203d48e2455 Modified Files: gdk/gdk_join.c Branch: linear-hashing Log Message: Changed calculation of new BAT size during join. diffs (16 lines): diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c --- a/gdk/gdk_join.c +++ b/gdk/gdk_join.c @@ -223,9 +223,9 @@ maybeextend(BAT *restrict r1, BAT *restr if (BATcount(r1) + cnt > BATcapacity(r1)) { /* make some extra space by extrapolating how much * more we need (fraction of l we've seen so far is -* used as the fraction of the expected result size -* we've produced so far) */ - BUN newcap = (BUN) ((double) lcnt / lcur * (BATcount(r1) + cnt) * 1.5); +* used to estimate a new size but with a shallow +* slope so that a skewed join doesn't overwhelm) */ + BUN newcap = (BUN) (lcnt / (lcnt / 4.0 + lcur * .75) * (BATcount(r1) + cnt)); if (newcap < cnt + BATcount(r1)) newcap = cnt + BATcount(r1) + 1024; if (newcap > maxsize) ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Nov2019 - Test some possible sys utility functions
Changeset: dca306d18680 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dca306d18680 Added Files: sql/test/sys-schema/Tests/utilities.sql sql/test/sys-schema/Tests/utilities.stable.err sql/test/sys-schema/Tests/utilities.stable.out Modified Files: sql/test/sys-schema/Tests/All Branch: Nov2019 Log Message: Test some possible sys utility functions diffs (200 lines): diff --git a/sql/test/sys-schema/Tests/All b/sql/test/sys-schema/Tests/All --- a/sql/test/sys-schema/Tests/All +++ b/sql/test/sys-schema/Tests/All @@ -11,3 +11,5 @@ HAVE_NETCDF?netcdf_tables_checks HAVE_SAMTOOLS?bam_tables_checks HAVE_FITS&HAVE_GEOM&HAVE_LIDAR&HAVE_SHP&HAVE_NETCDF&HAVE_SAMTOOLS?systemfunctions + +utilities diff --git a/sql/test/sys-schema/Tests/utilities.sql b/sql/test/sys-schema/Tests/utilities.sql new file mode 100644 --- /dev/null +++ b/sql/test/sys-schema/Tests/utilities.sql @@ -0,0 +1,48 @@ +-- utility functions on sys schema objects + +-- utility function to find the id of an existing schema name. +-- It will return NULL if schema name does not exist. +CREATE OR REPLACE function schema_id(sname varchar(1024)) RETURNS INT +BEGIN + RETURN SELECT min(id) from sys.schemas where name = sname; +END; + +SELECT schema_id('sys'); +SELECT schema_id('json') > 2000; +SELECT schema_id('hsfdjkhksf does not exist'); + + +-- utility function to find the id of an existing table name in a specific schema. +-- It will return NULL if table name does not exist in specified schema or schema name does not exist. +CREATE OR REPLACE function table_id(sname varchar(1024), tname varchar(1024)) RETURNS INT +BEGIN + RETURN SELECT min(id) from sys.tables where name = tname AND schema_id = (SELECT id from sys.schemas where name = sname); +END; + +SELECT table_id('sys','tables') > 2000; +SELECT table_id(current_schema,'columns') > 2000; +SELECT name, type, type_digits, type_scale, "null", number from columns where table_id = table_id('sys','tables'); +SELECT table_id('sys','hsfdjkhksf does not exist'); + +-- utility function to find the id of an existing table name in the current schema. +-- It will return NULL if table name does not exist in the current schema. +CREATE OR REPLACE function table_id(tname varchar(1024)) RETURNS INT +BEGIN + RETURN SELECT min(id) from sys.tables where name = tname AND schema_id = (SELECT id from sys.schemas where name = current_schema); +END; + +SELECT current_schema; +SELECT table_id('tables') > 2000; +SELECT table_id('columns') > 2000; +SELECT name, type, type_digits, type_scale, "null", number from columns where table_id = table_id('tables'); +SELECT table_id('hsfdjkhksf does not exist'); + + + +\dftv +-- cleanup utilities +DROP ALL function table_id; +DROP function schema_id; + +\dftv + diff --git a/sql/test/sys-schema/Tests/utilities.stable.err b/sql/test/sys-schema/Tests/utilities.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/sys-schema/Tests/utilities.stable.err @@ -0,0 +1,12 @@ +stderr of test 'utilities` in directory 'sql/test/sys-schema` itself: + + +# 17:20:48 > +# 17:20:48 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-251920" "--port=33727" +# 17:20:48 > + + +# 17:20:48 > +# 17:20:48 > "Done." +# 17:20:48 > + diff --git a/sql/test/sys-schema/Tests/utilities.stable.out b/sql/test/sys-schema/Tests/utilities.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/sys-schema/Tests/utilities.stable.out @@ -0,0 +1,116 @@ +stdout of test 'utilities` in directory 'sql/test/sys-schema` itself: + + +# 17:33:45 > +# 17:33:45 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-253132" "--port=35072" +# 17:33:45 > + +#CREATE OR REPLACE function schema_id(sname varchar(1024)) RETURNS INT +#BEGIN +# RETURN SELECT min(id) from sys.schemas where name = sname; +#END; +#SELECT schema_id('sys'); +% .L2 # table_name +% L2 # name +% int # type +% 4 # length +[ 2000 ] +#SELECT schema_id('json') > 2000; +% .L2 # table_name +% L2 # name +% boolean # type +% 5 # length +[ true ] +#SELECT schema_id('hsfdjkhksf does not exist'); +% .L2 # table_name +% L2 # name +% int # type +% 1 # length +[ NULL ] +#CREATE OR REPLACE function table_id(sname varchar(1024), tname varchar(1024)) RETURNS INT +#BEGIN +# RETURN SELECT min(id) from sys.tables where name = tname AND schema_id = (SELECT id from sys.schemas where name = sname); +#END; +#SELECT table_id('sys','tables') > 2000; +% .L2 # table_name +% L2 # name +% boolean # type +% 5 # length +[ true ] +#SELECT table_id(current_schema,'columns') > 2000; +% .L2 # table_name +% L2 # name +% boolean # type +% 5 # length +[ true ] +#SELECT name, type, type_digits, type_scale, "null", number from columns where table_id = table_id('sys','tables'); +% .columns,.columns, .columns, .columns, .columns, .columns # table_name +% name,type, type_digits,type_scale, null, number # name +
MonetDB: default - Approved output
Changeset: de331148d6e6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=de331148d6e6 Modified Files: sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err sql/test/subquery/Tests/subquery4.stable.out Branch: default Log Message: Approved output diffs (59 lines): diff --git a/sql/test/subquery/Tests/subquery4.sql b/sql/test/subquery/Tests/subquery4.sql --- a/sql/test/subquery/Tests/subquery4.sql +++ b/sql/test/subquery/Tests/subquery4.sql @@ -146,8 +146,8 @@ UPDATE another_T SET col5 = 1 WHERE col5 DELETE FROM another_T WHERE col1 = (SELECT 1 UNION ALL SELECT 2); --error, more than one row returned by a subquery used as an expression INSERT INTO another_T VALUES ((SELECT 1 UNION ALL SELECT 2),2,3,4,5,6,7,8); --error, more than one row returned by a subquery used as an expression ---UPDATE another_T SET (col5, col6) = (SELECT MIN(1), MAX(2) OVER ()); --4 rows affected ---UPDATE another_T SET (col7, col8) = (SELECT 1,2 UNION ALL SELECT 1,2); --error, more than one row returned by a subquery used as an expression +UPDATE another_T SET (col5, col6) = (SELECT MIN(10), MAX(21) OVER ()); --4 rows affected +UPDATE another_T SET (col7, col8) = (SELECT 1,2 UNION ALL SELECT 1,2); --error, more than one row returned by a subquery used as an expression UPDATE another_T SET (col7, col8) = (SELECT 1 UNION ALL SELECT 2); --error, number of columns does not match number of values UPDATE another_T SET (col7, col8) = (SELECT 1,2,3); --error, number of columns does not match number of values UPDATE another_T SET col5 = 1, col5 = 6; --error, multiple assignments to same column "col5" diff --git a/sql/test/subquery/Tests/subquery4.stable.err b/sql/test/subquery/Tests/subquery4.stable.err --- a/sql/test/subquery/Tests/subquery4.stable.err +++ b/sql/test/subquery/Tests/subquery4.stable.err @@ -156,7 +156,11 @@ MAPI = (monetdb) /var/tmp/mtest-204362/ QUERY = INSERT INTO another_T VALUES ((SELECT 1 UNION ALL SELECT 2),2,3,4,5,6,7,8); --error, more than one row returned by a subquery used as an expression ERROR = !Cardinality violation, scalar value expected CODE = 21000 -MAPI = (monetdb) /var/tmp/mtest-450395/.s.monetdb.35919 +MAPI = (monetdb) /var/tmp/mtest-657770/.s.monetdb.37553 +QUERY = UPDATE another_T SET (col7, col8) = (SELECT 1,2 UNION ALL SELECT 1,2); --error, more than one row returned by a subquery used as an expression +ERROR = !Cardinality violation, scalar value expected +CODE = 21000 +MAPI = (monetdb) /var/tmp/mtest-657770/.s.monetdb.37553 QUERY = UPDATE another_T SET (col7, col8) = (SELECT 1 UNION ALL SELECT 2); --error, number of columns does not match number of values ERROR = !UPDATE: The number of specified columns between the SET clause and the right side don't match (2 != 1) CODE = 42000 diff --git a/sql/test/subquery/Tests/subquery4.stable.out b/sql/test/subquery/Tests/subquery4.stable.out --- a/sql/test/subquery/Tests/subquery4.stable.out +++ b/sql/test/subquery/Tests/subquery4.stable.out @@ -173,6 +173,8 @@ stdout of test 'subquery4` in directory [ 0] #DELETE FROM another_T WHERE col7 = (SELECT SUM(col3) OVER ()); [ 0] +#UPDATE another_T SET (col5, col6) = (SELECT MIN(10), MAX(21) OVER ()); --4 rows affected +[ 4] #DECLARE x int; #DECLARE y int; #INSERT INTO another_T VALUES ((SELECT SUM(1)),(SELECT SUM(2) OVER ()),3,4,5,6,7,8); --allowed @@ -181,11 +183,11 @@ stdout of test 'subquery4` in directory % sys.another_t, sys.another_t, sys.another_t, sys.another_t, sys.another_t, sys.another_t, sys.another_t, sys.another_t # table_name % col1,col2, col3, col4, col5, col6, col7, col8 # name % int, int,int,int,int,int,int,int # type -% 4, 4, 4, 5, 4, 4, 4, 4 # length -[ 1, 2, 5, 26, 5, 6, 7, 8 ] -[ 11, 22, 55, 186,55, 66, 77, 88 ] -[ 111, 222,555,1786, 555,666,777,888 ] -[ ,, , 17786, , , , ] +% 4, 4, 4, 5, 2, 2, 4, 4 # length +[ 1, 2, 5, 26, 10, 21, 7, 8 ] +[ 11, 22, 55, 186,10, 21, 77, 88 ] +[ 111, 222,555,1786, 10, 21, 777,888 ] +[ ,, , 17786, 10, 21, , ] [ 1, 2, 3, 4, 5, 6, 7, 8 ] #CREATE PROCEDURE crashme(a int) BEGIN DECLARE x INT; SET x = a; END; #create sequence "debugme" as integer start with 1; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Disallow multiple assignments on the same col...
Changeset: 5f09438acd6f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5f09438acd6f Modified Files: sql/server/rel_updates.c sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err Branch: default Log Message: Disallow multiple assignments on the same column on the same update. Also test for table update privileges on every case. diffs (115 lines): diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -910,16 +910,10 @@ rel_update(mvc *sql, sql_rel *t, sql_rel static sql_exp * update_check_column(mvc *sql, sql_table *t, sql_column *c, sql_exp *v, sql_rel *r, char *cname, const char *action) { - if (!c) { - rel_destroy(r); - return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, cname); - } if (!table_privs(sql, t, PRIV_UPDATE) && !sql_privilege(sql, sql->user_id, c->base.id, PRIV_UPDATE)) return sql_error(sql, 02, SQLSTATE(42000) "%s: insufficient privileges for user '%s' to update table '%s' on column '%s'", action, stack_get_string(sql, "current_user"), t->base.name, cname); - if (!v || (v = rel_check_type(sql, &c->type, r, v, type_equal)) == NULL) { - rel_destroy(r); + if (!v || (v = rel_check_type(sql, &c->type, r, v, type_equal)) == NULL) return NULL; - } return v; } @@ -964,6 +958,9 @@ update_generate_assignments(sql_query *q if (single && a->token == SQL_DEFAULT) { char *colname = assignment->h->next->data.sval; sql_column *col = mvc_bind_column(sql, t, colname); + + if (!col) + return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, colname); if (col->def) { char *typestr = subtype2string2(&col->type); if (!typestr) @@ -1019,6 +1016,10 @@ update_generate_assignments(sql_query *q sql_column *c = mvc_bind_column(sql, t, cname); sql_exp *v = n->data; + if (!c) + return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, cname); + if (updates[c->colnr]) + return sql_error(sql, 02, SQLSTATE(42000) "%s: Multiple assignments to same column '%s'", action, c->base.name); if (mt && pcols) { for (node *nn = pcols->h; nn; nn = n->next) { int next = *(int*) nn->data; @@ -1035,13 +1036,11 @@ update_generate_assignments(sql_query *q exp_label(sql->sa, v, ++sql->label); if (!exp_is_atom(v) || outer) v = exp_ref(sql->sa, v); - if (!v) { /* check for NULL */ + if (!v) /* check for NULL */ v = exp_atom(sql->sa, atom_general(sql->sa, &c->type, NULL)); - } else if ((v = update_check_column(sql, t, c, v, r, cname, action)) == NULL) { + if (!(v = update_check_column(sql, t, c, v, r, cname, action))) return NULL; - } list_append(exps, exp_column(sql->sa, t->base.name, cname, &c->type, CARD_MULTI, 0, 0)); - assert(!updates[c->colnr]); exp_setname(sql->sa, v, c->t->base.name, c->base.name); updates[c->colnr] = v; } @@ -1049,6 +1048,10 @@ update_generate_assignments(sql_query *q char *cname = assignment->h->next->data.sval; sql_column *c = mvc_bind_column(sql, t, cname); + if (!c) + return sql_error(sql, 02, SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, cname); + if (updates[c->colnr]) + return sql_error(sql, 02, SQLSTATE(42000) "%s: Multiple assignments to same column '%s'", action, c->base.name); if (mt && pcols) { for (node *nn = pcols->h; nn; nn = nn->next) { int next = *(int*) nn->data; @@ -1061,11 +1064,10 @@ update_generate_assignments(sql_query *q
MonetDB: atom_strings - Merge with default
Changeset: 73b845eda04f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=73b845eda04f Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/mapilib/monetdb-mapi.pc.in sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql.h sql/backends/monet5/sql.mal sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h sql/include/sql_relation.h sql/server/rel_optimizer.c sql/server/rel_propagate.c sql/server/rel_psm.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_select.h sql/server/rel_unnest.c sql/server/rel_updates.c sql/test/BugTracker-2009/Tests/having_min_crash.SF-2795951.sql sql/test/BugTracker-2009/Tests/having_min_crash.SF-2795951.stable.out sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.stable.err sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-coalesce-error-message.Bug-6608.stable.err sql/test/miscellaneous/Tests/simple_selects.sql sql/test/miscellaneous/Tests/simple_selects.stable.err sql/test/subquery/Tests/subquery2.sql sql/test/subquery/Tests/subquery3.sql sql/test/subquery/Tests/subquery3.stable.err sql/test/subquery/Tests/subquery3.stable.out sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err sql/test/subquery/Tests/subquery4.stable.out Branch: atom_strings Log Message: Merge with default diffs (truncated from 2206 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -18886,6 +18886,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "transaction_commit", "pattern sql.transaction_commit(chain:int, name:str):void ", "SQLtransaction_commit;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_release", "pattern sql.transaction_release(chain:int, name:str):void ", "SQLtransaction_release;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_rollback", "pattern sql.transaction_rollback(chain:int, name:str):void ", "SQLtransaction_rollback;", "A transaction statement (type can be commit,release,rollback or start)"] +[ "sql", "unionfunc","pattern sql.unionfunc(mod:str, fcn:str, X_0:any...):any... ", "SQLunionfunc;","" ] [ "sql", "update", "pattern sql.update(mvc:int, sname:str, tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)"] [ "sql", "update_schemas", "pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table"] [ "sql", "update_tables","pattern sql.update_tables():void ", "SYSupdate_tables;","Procedure triggered on update of the sys._tables table"] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -26900,6 +26900,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "transaction_commit", "pattern sql.transaction_commit(chain:int, name:str):void ", "SQLtransaction_commit;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_release", "pattern sql.transaction_release(chain:int, name:str):void ", "SQLtransaction_release;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_rollback", "pattern sql.transaction_rollback(chain:int, name:str):void ", "SQLtransaction_rollback;", "A transaction statement (type can be commit,release,rollback or start)"] +[ "sql", "unionfunc","pattern sql.unionfunc(mod:str, fcn:str, X_0:any...):any... ", "SQLunionfunc;","" ] [ "sql", "update", "pattern sql.update(mvc:int, sname:str, tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)"] [ "sql", "update_schemas", "pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table"] [ "sql", "update_tab
MonetDB: pushdown - merged
Changeset: 53e0d7234ca9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=53e0d7234ca9 Modified Files: sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_mvc.h sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err Branch: pushdown Log Message: merged diffs (200 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -163,17 +163,27 @@ rel_lastexp(mvc *sql, sql_rel *rel ) static sql_rel * rel_zero_or_one(mvc *sql, sql_rel *rel, exp_kind ek) { - sql_exp *e = lastexp(rel); - if (!has_label(e)) - exp_label(sql->sa, e, ++sql->label); + if (is_topn(rel->op)) + rel = rel_project(sql->sa, rel, rel_projections(sql, rel, NULL, 1, 0)); if (ek.card < card_set && rel->card > CARD_ATOM) { - sql_subtype *t = exp_subtype(e); /* parameters don't have a type defined, for those use 'void' one */ - sql_subfunc *zero_or_one = sql_bind_func(sql->sa, sql->session->schema, "zero_or_one", t ? t : sql_bind_localtype("void"), NULL, F_AGGR); - - e = exp_ref(sql->sa, e); - e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, has_nil(e)); + assert (is_simple_project(rel->op) || is_set(rel->op)); + list *exps = rel->exps; rel = rel_groupby(sql, rel, NULL); - (void)rel_groupby_add_aggr(sql, rel, e); + for(node *n = exps->h; n; n=n->next) { + sql_exp *e = n->data; + if (!has_label(e)) + exp_label(sql->sa, e, ++sql->label); + sql_subtype *t = exp_subtype(e); /* parameters don't have a type defined, for those use 'void' one */ + sql_subfunc *zero_or_one = sql_bind_func(sql->sa, sql->session->schema, "zero_or_one", t ? t : sql_bind_localtype("void"), NULL, F_AGGR); + + e = exp_ref(sql->sa, e); + e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, has_nil(e)); + (void)rel_groupby_add_aggr(sql, rel, e); + } + } else { + sql_exp *e = lastexp(rel); + if (!has_label(e)) + exp_label(sql->sa, e, ++sql->label); } return rel; } @@ -5897,6 +5907,9 @@ rel_subquery(sql_query *query, sql_rel * rel = rel_query(query, rel, sq, toplevel, ek); stack_pop_frame(sql); + + if (rel && ek.type == type_relation && ek.card < card_set && rel->card >= CARD_MULTI) + return rel_zero_or_one(sql, rel, ek); return rel; } diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -928,7 +928,7 @@ update_generate_assignments(sql_query *q { mvc *sql = query->sql; sql_table *mt = NULL; - sql_exp *e = NULL, **updates = SA_ZNEW_ARRAY(sql->sa, sql_exp*, list_length(t->columns.set)); + sql_exp **updates = SA_ZNEW_ARRAY(sql->sa, sql_exp*, list_length(t->columns.set)); list *exps, *pcols = NULL; dnode *n; const char *rname = NULL; @@ -947,9 +947,7 @@ update_generate_assignments(sql_query *q pcols = mt->part.pexp->cols; } /* first create the project */ - e = exp_column(sql->sa, rname = rel_name(r), TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1); - exps = new_exp_list(sql->sa); - append(exps, e); + exps = list_append(new_exp_list(sql->sa), exp_column(sql->sa, rname = rel_name(r), TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1)); for (n = assignmentlist->h; n; n = n->next) { symbol *a = NULL; @@ -961,8 +959,7 @@ update_generate_assignments(sql_query *q a = assignment->h->data.sym; if (a) { - int status = sql->session->status; - exp_kind ek = {type_value, (single)?card_column:card_relation, FALSE}; + exp_kind ek = { (single)?type_value:type_relation, card_column, FALSE}; if (single && a->token == SQL_DEFAULT) { char *colname = assignment->h->next->data.sval; @@ -980,21 +977,15 @@ update_generate_assignments(sql_query *q v = rel_value_exp(query, &r, a, sql_sel | sql_update_set, ek); outer = 1; } else { + if (r) + query_push_outer(query, r, sql_sel); rel_val = rel_subquery(query, NULL, a, ek); - } - if (!single && !rel_val && r) { + if (r) +
MonetDB: default - handle multivalue update statements with subq...
Changeset: 83fe6822b8d7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=83fe6822b8d7 Modified Files: sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_mvc.h Branch: default Log Message: handle multivalue update statements with subqueries with cardinality problems diffs (104 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -163,17 +163,27 @@ rel_lastexp(mvc *sql, sql_rel *rel ) static sql_rel * rel_zero_or_one(mvc *sql, sql_rel *rel, exp_kind ek) { - sql_exp *e = lastexp(rel); - if (!has_label(e)) - exp_label(sql->sa, e, ++sql->label); + if (is_topn(rel->op)) + rel = rel_project(sql->sa, rel, rel_projections(sql, rel, NULL, 1, 0)); if (ek.card < card_set && rel->card > CARD_ATOM) { - sql_subtype *t = exp_subtype(e); /* parameters don't have a type defined, for those use 'void' one */ - sql_subfunc *zero_or_one = sql_bind_func(sql->sa, sql->session->schema, "zero_or_one", t ? t : sql_bind_localtype("void"), NULL, F_AGGR); - - e = exp_ref(sql->sa, e); - e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, has_nil(e)); + assert (is_simple_project(rel->op) || is_set(rel->op)); + list *exps = rel->exps; rel = rel_groupby(sql, rel, NULL); - (void)rel_groupby_add_aggr(sql, rel, e); + for(node *n = exps->h; n; n=n->next) { + sql_exp *e = n->data; + if (!has_label(e)) + exp_label(sql->sa, e, ++sql->label); + sql_subtype *t = exp_subtype(e); /* parameters don't have a type defined, for those use 'void' one */ + sql_subfunc *zero_or_one = sql_bind_func(sql->sa, sql->session->schema, "zero_or_one", t ? t : sql_bind_localtype("void"), NULL, F_AGGR); + + e = exp_ref(sql->sa, e); + e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, has_nil(e)); + (void)rel_groupby_add_aggr(sql, rel, e); + } + } else { + sql_exp *e = lastexp(rel); + if (!has_label(e)) + exp_label(sql->sa, e, ++sql->label); } return rel; } @@ -5897,6 +5907,9 @@ rel_subquery(sql_query *query, sql_rel * rel = rel_query(query, rel, sq, toplevel, ek); stack_pop_frame(sql); + + if (rel && ek.type == type_relation && ek.card < card_set && rel->card >= CARD_MULTI) + return rel_zero_or_one(sql, rel, ek); return rel; } diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -959,8 +959,7 @@ update_generate_assignments(sql_query *q a = assignment->h->data.sym; if (a) { - int status = sql->session->status; - exp_kind ek = {type_value, (single)?card_column:card_relation, FALSE}; + exp_kind ek = { (single)?type_value:type_relation, card_column, FALSE}; if (single && a->token == SQL_DEFAULT) { char *colname = assignment->h->next->data.sval; @@ -978,16 +977,12 @@ update_generate_assignments(sql_query *q v = rel_value_exp(query, &r, a, sql_sel | sql_update_set, ek); outer = 1; } else { + if (r) + query_push_outer(query, r, sql_sel); rel_val = rel_subquery(query, NULL, a, ek); - } - if (!single && !rel_val && r) { + if (r) + r = query_pop_outer(query); outer = 1; - sql->errstr[0] = 0; - sql->session->status = status; - /* TODO put in else above */ - query_push_outer(query, r, sql_sel); - rel_val = rel_subquery(query, NULL, a, ek); - r = query_pop_outer(query); } if ((single && !v) || (!single && !rel_val)) return NULL; diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -31,7 +31,7 @@ /* value vs predicate (boolean) */ #define type_value 0 -#define type_predicate 1 +#define type_relation 1 /* cardinality expected by enclosing operator */ #define card_none -1 /* psm call doesn't return anything */ @@ -40,6 +40,7 @@ #de
MonetDB: default - Simplify
Changeset: 11c33a434857 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=11c33a434857 Modified Files: sql/server/rel_updates.c Branch: default Log Message: Simplify diffs (71 lines): diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -928,7 +928,7 @@ update_generate_assignments(sql_query *q { mvc *sql = query->sql; sql_table *mt = NULL; - sql_exp *e = NULL, **updates = SA_ZNEW_ARRAY(sql->sa, sql_exp*, list_length(t->columns.set)); + sql_exp **updates = SA_ZNEW_ARRAY(sql->sa, sql_exp*, list_length(t->columns.set)); list *exps, *pcols = NULL; dnode *n; const char *rname = NULL; @@ -947,9 +947,7 @@ update_generate_assignments(sql_query *q pcols = mt->part.pexp->cols; } /* first create the project */ - e = exp_column(sql->sa, rname = rel_name(r), TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1); - exps = new_exp_list(sql->sa); - append(exps, e); + exps = list_append(new_exp_list(sql->sa), exp_column(sql->sa, rname = rel_name(r), TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1)); for (n = assignmentlist->h; n; n = n->next) { symbol *a = NULL; @@ -991,10 +989,8 @@ update_generate_assignments(sql_query *q rel_val = rel_subquery(query, NULL, a, ek); r = query_pop_outer(query); } - if ((single && !v) || (!single && !rel_val)) { - rel_destroy(r); + if ((single && !v) || (!single && !rel_val)) return NULL; - } if (rel_val && outer) { if (single) { if (!exp_name(v)) @@ -1016,22 +1012,14 @@ update_generate_assignments(sql_query *q dlist *cols = assignment->h->next->data.lval; dnode *m; node *n; - int nr; if (!rel_val) rel_val = r; - if (!rel_val || !is_project(rel_val->op)) { - rel_destroy(r); + if (!rel_val || !is_project(rel_val->op)) return sql_error(sql, 02, SQLSTATE(42000) "%s: Invalid right side of the SET clause", action); - } - if (dlist_length(cols) != list_length(rel_val->exps)) { - rel_destroy(r); + if (dlist_length(cols) != list_length(rel_val->exps)) return sql_error(sql, 02, SQLSTATE(42000) "%s: The number of specified columns between the SET clause and the right side don't match (%d != %d)", action, dlist_length(cols), list_length(rel_val->exps)); - } - nr = (list_length(rel_val->exps)-dlist_length(cols)); - for (n=rel_val->exps->h; nr; nr--, n = n->next) - ; - for (m = cols->h; n && m; n = n->next, m = m->next) { + for (n = rel_val->exps->h, m = cols->h; n && m; n = n->next, m = m->next) { char *cname = m->data.sval; sql_column *c = mvc_bind_column(sql, t, cname); sql_exp *v = n->data; @@ -1088,8 +1076,7 @@ update_generate_assignments(sql_query *q updates[c->colnr] = v; } } - e = exp_column(sql->sa, rname, TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1); - r = rel_project(sql->sa, r, append(new_exp_list(sql->sa),e)); + r = rel_project(sql->sa, r, list_append(new_exp_list(sql->sa), exp_column(sql->sa, rname, TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1))); r = rel_update(sql, bt, r, updates, exps); return r; } ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Nov2019 - Add test to test MySQL/MariaDB specific data ...
Changeset: c4fdcb5f8627 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c4fdcb5f8627 Added Files: sql/test/Tests/mediumint.sql sql/test/Tests/mediumint.stable.err sql/test/Tests/mediumint.stable.out Modified Files: sql/test/Tests/All Branch: Nov2019 Log Message: Add test to test MySQL/MariaDB specific data type mediumint. Note: in MySQL/MariaDB a MEDIUMINT is stored in 3 bytes and has a valid range of: -8388608 .. 8388607 In MonetDB it is mapped as a synonym of INTEGER data type. I also extended https://www.monetdb.org/Documentation/Manuals/SQLreference/BuiltinTypes diffs (107 lines): diff --git a/sql/test/Tests/All b/sql/test/Tests/All --- a/sql/test/Tests/All +++ b/sql/test/Tests/All @@ -48,6 +48,7 @@ cast_str2num big-example count +mediumint decimal decimal2 null diff --git a/sql/test/Tests/mediumint.sql b/sql/test/Tests/mediumint.sql new file mode 100644 --- /dev/null +++ b/sql/test/Tests/mediumint.sql @@ -0,0 +1,21 @@ +-- test support for MySQL/MariaDB specific data type: MEDIUMINT +-- Note: in MySQL/MariaDB a MEDIUMINT is stored in 3 bytes and has a valid range of: -8388608 .. 8388607 + +-- in MonetDB mediumint is accepted, but mapped to an int +create table meditbl(medi MEDIUMINT); + +\d meditbl +-- note: that the data type is now changed into: INTEGER +select name, type, type_digits, type_scale, number from sys.columns where name = 'medi' and table_id in (select id from sys.tables where name = 'meditbl'); + +-- it accepts all 32-bit signed integer values which are also possible in an int data type +INsert into meditbl values (0), (1), (-1), (32767), (-32767), (8388607), (-8388607), (2147483647), (-2147483647), (NULL); + +-- check for overflows (same as on an int) +INsert into meditbl values (2147483648); -- Error: overflow in conversion of 2147483648 to int. +INsert into meditbl values (-2147483648); -- Error: overflow in conversion of -2147483648 to int. + +select * from meditbl order by 1; + +drop table meditbl; + diff --git a/sql/test/Tests/mediumint.stable.err b/sql/test/Tests/mediumint.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/Tests/mediumint.stable.err @@ -0,0 +1,20 @@ +stderr of test 'mediumint` in directory 'sql/test` itself: + + +# 16:18:53 > +# 16:18:53 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-192912" "--port=32869" +# 16:18:53 > + +MAPI = (monetdb) /var/tmp/mtest-192912/.s.monetdb.32869 +QUERY = INsert into meditbl values (2147483648); -- Error: overflow in conversion of 2147483648 to int. +ERROR = !overflow in conversion of 2147483648 to int. +CODE = 22003 +MAPI = (monetdb) /var/tmp/mtest-192912/.s.monetdb.32869 +QUERY = INsert into meditbl values (-2147483648); -- Error: overflow in conversion of -2147483648 to int. +ERROR = !overflow in conversion of -2147483648 to int. +CODE = 22003 + +# 16:18:53 > +# 16:18:53 > "Done." +# 16:18:53 > + diff --git a/sql/test/Tests/mediumint.stable.out b/sql/test/Tests/mediumint.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/Tests/mediumint.stable.out @@ -0,0 +1,40 @@ +stdout of test 'mediumint` in directory 'sql/test` itself: + + +# 16:18:53 > +# 16:18:53 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-192912" "--port=32869" +# 16:18:53 > + +#create table meditbl(medi MEDIUMINT); +CREATE TABLE "sys"."meditbl" ( + "medi" INTEGER +); +#select name, type, type_digits, type_scale, number from sys.columns where name = 'medi' and table_id in (select id from sys.tables where name = 'meditbl'); +% .columns,.columns, .columns, .columns, .columns # table_name +% name,type, type_digits,type_scale, number # name +% varchar, varchar,int,int,int # type +% 4, 3, 2, 1, 1 # length +[ "medi", "int", 32, 0, 0 ] +#INsert into meditbl values (0), (1), (-1), (32767), (-32767), (8388607), (-8388607), (2147483647), (-2147483647), (NULL); +[ 10 ] +#select * from meditbl order by 1; +% sys.meditbl # table_name +% medi # name +% int # type +% 11 # length +[ NULL ] +[ -2147483647 ] +[ -8388607 ] +[ -32767 ] +[ -1 ] +[ 0] +[ 1] +[ 32767] +[ 8388607 ] +[ 2147483647 ] +#drop table meditbl; + +# 16:18:53 > +# 16:18:53 > "Done." +# 16:18:53 > + ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - If the right side of update set has more colu...
Changeset: 9e7926f0f473 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9e7926f0f473 Modified Files: sql/server/rel_updates.c sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err Branch: default Log Message: If the right side of update set has more columns than the left side, throw the error diffs (55 lines): diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -1020,10 +1020,13 @@ update_generate_assignments(sql_query *q if (!rel_val) rel_val = r; - if (!rel_val || !is_project(rel_val->op) || - dlist_length(cols) > list_length(rel_val->exps)) { + if (!rel_val || !is_project(rel_val->op)) { rel_destroy(r); - return sql_error(sql, 02, SQLSTATE(42000) "%s: too many columns specified", action); + return sql_error(sql, 02, SQLSTATE(42000) "%s: Invalid right side of the SET clause", action); + } + if (dlist_length(cols) != list_length(rel_val->exps)) { + rel_destroy(r); + return sql_error(sql, 02, SQLSTATE(42000) "%s: The number of specified columns between the SET clause and the right side don't match (%d != %d)", action, dlist_length(cols), list_length(rel_val->exps)); } nr = (list_length(rel_val->exps)-dlist_length(cols)); for (n=rel_val->exps->h; nr; nr--, n = n->next) diff --git a/sql/test/subquery/Tests/subquery4.sql b/sql/test/subquery/Tests/subquery4.sql --- a/sql/test/subquery/Tests/subquery4.sql +++ b/sql/test/subquery/Tests/subquery4.sql @@ -146,6 +146,11 @@ UPDATE another_T SET col5 = 1 WHERE col5 DELETE FROM another_T WHERE col1 = (SELECT 1 UNION ALL SELECT 2); --error, more than one row returned by a subquery used as an expression INSERT INTO another_T VALUES ((SELECT 1 UNION ALL SELECT 2),2,3,4,5,6,7,8); --error, more than one row returned by a subquery used as an expression +--UPDATE another_T SET (col5, col6) = (SELECT MIN(1), MAX(2) OVER ()); --4 rows affected +--UPDATE another_T SET (col7, col8) = (SELECT 1,2 UNION ALL SELECT 1,2); --error, more than one row returned by a subquery used as an expression +UPDATE another_T SET (col7, col8) = (SELECT 1 UNION ALL SELECT 2); --error, number of columns does not match number of values +UPDATE another_T SET (col7, col8) = (SELECT 1,2,3); --error, number of columns does not match number of values + DECLARE x int; SET x = MAX(1) over (); --error, not allowed DECLARE y int; diff --git a/sql/test/subquery/Tests/subquery4.stable.err b/sql/test/subquery/Tests/subquery4.stable.err --- a/sql/test/subquery/Tests/subquery4.stable.err +++ b/sql/test/subquery/Tests/subquery4.stable.err @@ -156,7 +156,15 @@ MAPI = (monetdb) /var/tmp/mtest-204362/ QUERY = INSERT INTO another_T VALUES ((SELECT 1 UNION ALL SELECT 2),2,3,4,5,6,7,8); --error, more than one row returned by a subquery used as an expression ERROR = !Cardinality violation, scalar value expected CODE = 21000 -MAPI = (monetdb) /var/tmp/mtest-204362/.s.monetdb.35709 +MAPI = (monetdb) /var/tmp/mtest-450395/.s.monetdb.35919 +QUERY = UPDATE another_T SET (col7, col8) = (SELECT 1 UNION ALL SELECT 2); --error, number of columns does not match number of values +ERROR = !UPDATE: The number of specified columns between the SET clause and the right side don't match (2 != 1) +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-450395/.s.monetdb.35919 +QUERY = UPDATE another_T SET (col7, col8) = (SELECT 1,2,3); --error, number of columns does not match number of values +ERROR = !UPDATE: The number of specified columns between the SET clause and the right side don't match (2 != 3) +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-450395/.s.monetdb.35919 QUERY = SET x = MAX(1) over (); --error, not allowed ERROR = !MAX: window function 'max' not allowed in SET clause (use subquery) CODE = 42000 ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: pushdown - merged
Changeset: 648228314846 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=648228314846 Modified Files: sql/server/rel_propagate.c sql/server/rel_psm.c sql/server/rel_rel.h sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_select.h sql/server/rel_updates.c sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err sql/test/miscellaneous/Tests/simple_selects.sql sql/test/miscellaneous/Tests/simple_selects.stable.err sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err Branch: pushdown Log Message: merged diffs (truncated from 319 to 300 lines): diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c --- a/sql/server/rel_propagate.c +++ b/sql/server/rel_propagate.c @@ -160,7 +160,7 @@ generate_partition_limits(sql_query *que return exp_atom(sql->sa, amax); } else { exp_kind ek = {type_value, card_value, FALSE}; - sql_exp *e = rel_value_exp2(query, r, s, sql_sel | sql_values, ek); + sql_exp *e = rel_value_exp2(query, r, s, sql_sel | sql_values, ek); if (!e) return NULL; diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -242,8 +242,9 @@ rel_psm_while_do( sql_query *query, sql_ list *whilestmts; dnode *n = w; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; whilestmts = sequential_block(query, res, restypelist, n->data.lval, n->next->data.sval, is_func); @@ -280,8 +281,9 @@ psm_if_then_else( sql_query *query, sql_ list *ifstmts, *elsestmts; dnode *n = elseif->data.sym->data.lval->h; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; ifstmts = sequential_block(query, res, restypelist, n->data.lval, NULL, is_func); n = n->next; @@ -319,8 +321,9 @@ rel_psm_if_then_else( sql_query *query, list *ifstmts, *elsestmts; dnode *n = elseif; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; ifstmts = sequential_block(query, res, restypelist, n->data.lval, NULL, is_func); n = n->next; @@ -421,7 +424,8 @@ rel_psm_case( sql_query *query, sql_subt while(n) { dnode *m = n->data.sym->data.lval->h; sql_rel *rel = NULL; - sql_exp *cond = rel_logical_value_exp(query, &rel, m->data.sym, sql_sel); + exp_kind ek = {type_value, card_value, FALSE}; + sql_exp *cond = rel_logical_value_exp(query, &rel, m->data.sym, sql_sel, ek); list *if_stmts = NULL; sql_exp *case_stmt = NULL; @@ -820,6 +824,9 @@ rel_create_func(sql_query *query, dlist return sql_error(sql, 02, SQLSTATE(3F000) "CREATE %s: no such schema '%s'", F, sname); type_list = create_type_list(sql, params, 1); + if ((type == F_FUNC || type == F_AGGR) && sql_bind_func_(sql->sa, s, fname, type_list, (type == F_FUNC) ? F_AGGR : F_FUNC)) + return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: there's %s with the name '%s' and the same parameters, which causes ambiguous calls", F, (type == F_FUNC) ? "an aggregate" : "a function", fname); + if ((sf = sql_bind_func_(sql->sa, s, fname, type_list, type)) != NULL && create) { if (replace) { sql_func *func = sf->func; diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -449,7 +449,8 @@ column_option( char *err = NULL, *r; if (sym->token == SQL_COLUMN || sym->token == SQL_IDENT) { - sql_exp *e = rel_logical_value_exp(query, NULL, sym, sql_sel); + exp_kind ek = {type_value, card_value, FALSE}; + sql_exp *e = rel_logical_value_exp(query, NULL, sym, sql_sel, ek); if (e && is_atom(e->type)) {
MonetDB: default - fixed cardinality problems with updates/inserts
Changeset: 7809e2916a39 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7809e2916a39 Modified Files: sql/server/rel_psm.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_select.h sql/server/rel_updates.c Branch: default Log Message: fixed cardinality problems with updates/inserts diffs (202 lines): diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -242,8 +242,9 @@ rel_psm_while_do( sql_query *query, sql_ list *whilestmts; dnode *n = w; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; whilestmts = sequential_block(query, res, restypelist, n->data.lval, n->next->data.sval, is_func); @@ -280,8 +281,9 @@ psm_if_then_else( sql_query *query, sql_ list *ifstmts, *elsestmts; dnode *n = elseif->data.sym->data.lval->h; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; ifstmts = sequential_block(query, res, restypelist, n->data.lval, NULL, is_func); n = n->next; @@ -319,8 +321,9 @@ rel_psm_if_then_else( sql_query *query, list *ifstmts, *elsestmts; dnode *n = elseif; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; ifstmts = sequential_block(query, res, restypelist, n->data.lval, NULL, is_func); n = n->next; @@ -421,7 +424,8 @@ rel_psm_case( sql_query *query, sql_subt while(n) { dnode *m = n->data.sym->data.lval->h; sql_rel *rel = NULL; - sql_exp *cond = rel_logical_value_exp(query, &rel, m->data.sym, sql_sel); + exp_kind ek = {type_value, card_value, FALSE}; + sql_exp *cond = rel_logical_value_exp(query, &rel, m->data.sym, sql_sel, ek); list *if_stmts = NULL; sql_exp *case_stmt = NULL; diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -449,7 +449,8 @@ column_option( char *err = NULL, *r; if (sym->token == SQL_COLUMN || sym->token == SQL_IDENT) { - sql_exp *e = rel_logical_value_exp(query, NULL, sym, sql_sel); + exp_kind ek = {type_value, card_value, FALSE}; + sql_exp *e = rel_logical_value_exp(query, NULL, sym, sql_sel, ek); if (e && is_atom(e->type)) { atom *a = exp_value(sql, e, sql->args, sql->argc); diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -637,7 +637,7 @@ rel_named_table_function(sql_query *quer l = l->next; /* skip distinct */ if (l->next) { /* table call with subquery */ if (l->next->type == type_symbol || l->next->type == type_list) { - exp_kind iek = {type_value, card_column, TRUE}; + exp_kind iek = {type_value, card_set, TRUE}; list *exps = sa_list(sql->sa); int count = 0; @@ -2101,10 +2101,9 @@ rel_in_exp(sql_query *query, sql_rel *re } sql_exp * -rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol *sc, int f) +rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol *sc, int f, exp_kind ek) { mvc *sql = query->sql; - exp_kind ek = {type_value, card_column, FALSE}; if (!sc) return NULL; @@ -2119,8 +2118,8 @@ rel_logical_value_exp(sql_query *query, symbol *lo = sc->data.lval->h->data.sym; symbol *ro = sc->data.lval->h->next->data.sym; - sql_exp *ls = rel_logical_value_exp(query, rel, lo, f); - sql_exp *rs = rel_logical_value_exp(query, rel, ro, f); + sql_exp *ls = rel_logical_value_exp(query, rel, lo, f, ek); + sql_exp *rs = rel_logical_value_exp(query, rel, ro, f, ek); if (!ls || !rs) return NULL; @@ -2201,7 +2200,7 @@ rel_logi
MonetDB: linear-hashing - Modernized initialization.
Changeset: 71c5a108151b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=71c5a108151b Modified Files: clients/odbc/driver/ODBCUtil.c Branch: linear-hashing Log Message: Modernized initialization. diffs (truncated from 786 to 300 lines): diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c --- a/clients/odbc/driver/ODBCUtil.c +++ b/clients/odbc/driver/ODBCUtil.c @@ -946,84 +946,707 @@ ODBCParseID(const char *tab, const char } struct sql_types ODBC_sql_types[] = { - {SQL_CHAR, SQL_CHAR, 0, 0, UNAFFECTED, 1, UNAFFECTED, 0, SQL_FALSE}, - {SQL_VARCHAR, SQL_VARCHAR, 0, 0, UNAFFECTED, 1, UNAFFECTED, 0, SQL_FALSE}, - {SQL_LONGVARCHAR, SQL_LONGVARCHAR, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_WCHAR, SQL_WCHAR, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_WVARCHAR, SQL_WVARCHAR, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_WLONGVARCHAR, SQL_WLONGVARCHAR, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_DECIMAL, SQL_DECIMAL, 0, 17, UNAFFECTED, UNAFFECTED, 0, 10, SQL_TRUE}, - {SQL_NUMERIC, SQL_NUMERIC, 0, 17, UNAFFECTED, UNAFFECTED, 0, 10, SQL_TRUE}, - {SQL_BIT, SQL_BIT, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_TINYINT, SQL_TINYINT, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 10, SQL_TRUE}, - {SQL_SMALLINT, SQL_SMALLINT, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 10, SQL_TRUE}, - {SQL_INTEGER, SQL_INTEGER, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 10, SQL_TRUE}, - {SQL_BIGINT, SQL_BIGINT, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 10, SQL_TRUE}, - {SQL_HUGEINT, SQL_HUGEINT, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 10, SQL_TRUE}, - {SQL_REAL, SQL_REAL, 0, FLT_MANT_DIG, UNAFFECTED, UNAFFECTED, UNAFFECTED, 2, SQL_FALSE}, - {SQL_FLOAT, SQL_FLOAT, 0, DBL_MANT_DIG, UNAFFECTED, UNAFFECTED, UNAFFECTED, 2, SQL_FALSE}, - {SQL_DOUBLE, SQL_DOUBLE, 0, DBL_MANT_DIG, UNAFFECTED, UNAFFECTED, UNAFFECTED, 2, SQL_FALSE}, - {SQL_BINARY, SQL_BINARY, 0, 0, UNAFFECTED, 1, UNAFFECTED, 0, SQL_FALSE}, - {SQL_VARBINARY, SQL_VARBINARY, 0, 0, UNAFFECTED, 1, UNAFFECTED, 0, SQL_FALSE}, - {SQL_LONGVARBINARY, SQL_LONGVARBINARY, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_GUID, SQL_GUID, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_TYPE_DATE, SQL_DATETIME, SQL_CODE_DATE, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_TYPE_TIME, SQL_DATETIME, SQL_CODE_TIME, 0, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_TYPE_TIMESTAMP, SQL_DATETIME, SQL_CODE_TIMESTAMP, 6, UNAFFECTED, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_MONTH, SQL_INTERVAL, SQL_CODE_MONTH, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_YEAR, SQL_INTERVAL, SQL_CODE_YEAR, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_YEAR_TO_MONTH, SQL_INTERVAL, SQL_CODE_YEAR_TO_MONTH, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_DAY, SQL_INTERVAL, SQL_CODE_DAY, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_HOUR, SQL_INTERVAL, SQL_CODE_HOUR, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_MINUTE, SQL_INTERVAL, SQL_CODE_MINUTE, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_SECOND, SQL_INTERVAL, SQL_CODE_SECOND, 6, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_DAY_TO_HOUR, SQL_INTERVAL, SQL_CODE_DAY_TO_HOUR, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_DAY_TO_MINUTE, SQL_INTERVAL, SQL_CODE_DAY_TO_MINUTE, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_DAY_TO_SECOND, SQL_INTERVAL, SQL_CODE_DAY_TO_SECOND, 6, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_HOUR_TO_MINUTE, SQL_INTERVAL, SQL_CODE_HOUR_TO_MINUTE, 0, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_HOUR_TO_SECOND, SQL_INTERVAL, SQL_CODE_HOUR_TO_SECOND, 6, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {SQL_INTERVAL_MINUTE_TO_SECOND, SQL_INTERVAL, SQL_CODE_MINUTE_TO_SECOND, 6, 2, UNAFFECTED, UNAFFECTED, 0, SQL_FALSE}, - {0, 0, 0, 0, 0, 0, 0, 0, 0},/* sentinel */ + { + .concise_type = SQL_CHAR, + .type = SQL_CHAR, + .datetime_interval_precision = UNAFFECTED, + .length = 1, + .scale = UNAFFECTED, + .fixed = SQL_FALSE, + }, + { + .concise_type = SQL_VARCHAR, + .type = SQL_VARCHAR, + .datetime_interval_precision = UNAFFECTED, + .length = 1, + .scale = UNAFFECTED, + .fixed = SQL_FALSE, + }, + { + .concise_type =
MonetDB: default - Disallow creating aggregates and functions wi...
Changeset: 6a2511b13bd4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6a2511b13bd4 Modified Files: sql/server/rel_psm.c sql/test/miscellaneous/Tests/simple_selects.sql sql/test/miscellaneous/Tests/simple_selects.stable.err Branch: default Log Message: Disallow creating aggregates and functions with the same name, schema and parameters simultaneously. That would lead to ambiguous calls diffs (44 lines): diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -820,6 +820,9 @@ rel_create_func(sql_query *query, dlist return sql_error(sql, 02, SQLSTATE(3F000) "CREATE %s: no such schema '%s'", F, sname); type_list = create_type_list(sql, params, 1); + if ((type == F_FUNC || type == F_AGGR) && sql_bind_func_(sql->sa, s, fname, type_list, (type == F_FUNC) ? F_AGGR : F_FUNC)) + return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: there's %s with the name '%s' and the same parameters, which causes ambiguous calls", F, (type == F_FUNC) ? "an aggregate" : "a function", fname); + if ((sf = sql_bind_func_(sql->sa, s, fname, type_list, type)) != NULL && create) { if (replace) { sql_func *func = sf->func; diff --git a/sql/test/miscellaneous/Tests/simple_selects.sql b/sql/test/miscellaneous/Tests/simple_selects.sql --- a/sql/test/miscellaneous/Tests/simple_selects.sql +++ b/sql/test/miscellaneous/Tests/simple_selects.sql @@ -70,6 +70,9 @@ select substring('abc' from 1 for null); select substring('abc' from null for 2); select substring('abc' from null for null); +CREATE FUNCTION count(input INT) RETURNS INT BEGIN RETURN SELECT 1; END; --error, ambiguous, there's an aggregate named count with the same parameters +CREATE AGGREGATE sin(input REAL) RETURNS REAL EXTERNAL NAME "mmath"."sin"; --error, ambiguous, there's a function named sin with the same parameters + select length(myblob), octet_length(myblob), length(mystr), octet_length(mystr) from (values (cast(null as blob), cast(null as char(32 as my(myblob, mystr); select md5(null); diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.err b/sql/test/miscellaneous/Tests/simple_selects.stable.err --- a/sql/test/miscellaneous/Tests/simple_selects.stable.err +++ b/sql/test/miscellaneous/Tests/simple_selects.stable.err @@ -117,6 +117,14 @@ MAPI = (monetdb) /var/tmp/mtest-316445/ QUERY = select cast(true as interval month); --error, not possible ERROR = !types boolean(1,0) and month_interval(3,0) are not equal CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-416559/.s.monetdb.3 +QUERY = CREATE FUNCTION count(input INT) RETURNS INT BEGIN RETURN SELECT 1; END; --error, ambiguous, there's an aggregate named count with the same parameters +ERROR = !CREATE FUNCTION: there's an aggregate with the name 'count' and the same parameters, which causes ambiguous calls +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-416559/.s.monetdb.3 +QUERY = CREATE AGGREGATE sin(input REAL) RETURNS REAL EXTERNAL NAME "mmath"."sin"; --error, ambiguous, there's a function named sin with the same parameters +ERROR = !CREATE AGGREGATE: there's a function with the name 'sin' and the same parameters, which causes ambiguous calls +CODE = 42000 # 17:31:38 > # 17:31:38 > "Done." ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: linear-hashing - Merge with Nov2019 branch.
Changeset: e7d31fdeed12 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e7d31fdeed12 Modified Files: clients/odbc/driver/SQLGetTypeInfo.c Branch: linear-hashing Log Message: Merge with Nov2019 branch. diffs (truncated from 1512 to 300 lines): diff --git a/clients/odbc/driver/SQLGetTypeInfo.c b/clients/odbc/driver/SQLGetTypeInfo.c --- a/clients/odbc/driver/SQLGetTypeInfo.c +++ b/clients/odbc/driver/SQLGetTypeInfo.c @@ -57,761 +57,824 @@ static const struct types { * Except for the type_name value, the string values are ready * to paste into an SQL query (i.e. including quotes). */ { - "uuid", /* type_name */ - SQL_GUID, /* data_type */ - 36, /* column_size */ - "NULL", /* literal_prefix */ - "NULL", /* literal_suffix */ - "NULL", /* create_params */ - SQL_NULLABLE, /* nullable */ - SQL_FALSE, /* case_sensitive */ - SQL_PRED_BASIC, /* searchable */ - -1, /* unsigned_attribute */ - SQL_FALSE, /* fixed_prec_scale */ - -1, /* auto_unique_value */ - "NULL", /* local_type_name */ - -1, /* minimum_scale */ - -1, /* maximum_scale */ - SQL_GUID, /* sql_data_type */ - -1, /* sql_datetime_sub */ - -1, /* num_prec_radix */ - -1, /* interval_precision */ + .type_name = "uuid", + .data_type = SQL_GUID, + .column_size = 36, + .literal_prefix = "NULL", + .literal_suffix = "NULL", + .create_params = "NULL", + .nullable = SQL_NULLABLE, + .case_sensitive = SQL_FALSE, + .searchable = SQL_PRED_BASIC, + .unsigned_attribute = -1, + .fixed_prec_scale = SQL_FALSE, + .auto_unique_value = -1, + .local_type_name = "NULL", + .minimum_scale = -1, + .maximum_scale = -1, + .sql_data_type = SQL_GUID, + .sql_datetime_sub = -1, + .num_prec_radix = -1, + .interval_precision = -1, }, { - "character large object", /* type_name */ - SQL_WLONGVARCHAR, /* data_type */ - 100,/* column_size */ - "", /* literal_prefix */ - "", /* literal_suffix */ - "NULL", /* create_params */ - SQL_NULLABLE, /* nullable */ - SQL_TRUE, /* case_sensitive */ - SQL_SEARCHABLE, /* searchable */ - -1, /* unsigned_attribute */ - SQL_FALSE, /* fixed_prec_scale */ - SQL_FALSE, /* auto_unique_value */ - "NULL", /* local_type_name */ - -1, /* minimum_scale */ - -1, /* maximum_scale */ - SQL_WLONGVARCHAR, /* sql_data_type */ - -1, /* sql_datetime_sub */ - -1, /* num_prec_radix */ - -1, /* interval_precision */ + .type_name = "character large object", + .data_type = SQL_WLONGVARCHAR, + .column_size = 100, + .literal_prefix = "", + .literal_suffix = "", + .create_params = "NULL", + .nullable = SQL_NULLABLE, + .case_sensitive = SQL_TRUE, + .searchable = SQL_SEARCHABLE, + .unsigned_attribute = -1, + .fixed_prec_scale = SQL_FALSE, + .auto_unique_value = SQL_FALSE, + .local_type_name = "NULL", + .minimum_scale = -1, + .maximum_scale = -1, + .sql_data_type = SQL_WLONGVARCHAR, + .sql_datetime_sub = -1, + .num_prec_radix = -1, + .interval_precision = -1, }, { - "varchar", /* type_name */ - SQL_WVARCHAR, /* data_type */ - 100,/* column_size */ - "", /* literal_prefix */ - "", /* literal_suffix */ - "'length'", /* create_params */ - SQL_NULLABLE, /* nullable *
MonetDB: out2in - Save work in progress.
Changeset: b6d31770d27b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b6d31770d27b Added Files: sql/server/cmp_exp_eval.h sql/server/rel_outer_join_optimizer.h Branch: out2in Log Message: Save work in progress. diffs (89 lines): diff --git a/sql/server/cmp_exp_eval.h b/sql/server/cmp_exp_eval.h new file mode 100644 --- /dev/null +++ b/sql/server/cmp_exp_eval.h @@ -0,0 +1,5 @@ +#include "monetdb_config.h" +#include "sql_relation.h" +#include "rel_exp.h" + +#define _TODO assert(0) diff --git a/sql/server/rel_outer_join_optimizer.h b/sql/server/rel_outer_join_optimizer.h new file mode 100644 --- /dev/null +++ b/sql/server/rel_outer_join_optimizer.h @@ -0,0 +1,74 @@ +#include "monetdb_config.h" +#include "sql_relation.h" +#include "rel_exp.h" + +#define _TODO assert(0) + +static inline sql_exp* +replace_inner_column_references_with_null(mvc *sql, sql_exp* e, sql_rel* i /*inner relation*/) { + +sql_exp* t/*to-be-transformed*/ = exp_copy(sql, e); + +_TODO; + +return t; +} + +static inline bool +check_if_selection_expression_is_null_rejecting(mvc *sql, sql_exp* e, sql_rel* i /*inner relation*/) { +assert(e->type == e_cmp); + +sql_exp* t = replace_inner_column_references_with_null(sql, e, i); + + return exp_is_false(sql, e); +} + +static sql_rel * +rel_outer2inner_join(mvc *sql, sql_rel *rel, int *changes) +{ + list *exps = NULL; + sql_rel *r = NULL; + node *n; + + exps = rel->exps; + r = rel->l; + + /* push select through join */ + if (is_select(rel->op) && exps && r && r->op == op_left && !(rel_is_ref(r))) { + if () + for (n = exps->h; n; n = n->next) { + sql_exp *e = n->data; + if (e->type == e_cmp && !e->f && !is_complex_exp(e->flag)) { + sql_rel *nr = NULL; + sql_exp *re = e->r, *ne = rel_find_exp(r, re); + + if (ne && ne->card >= CARD_AGGR) + re->card = ne->card; + + if (re->card >= CARD_AGGR) { + nr = rel_push_join(sql, r, e->l, re, NULL, e); + } else { + nr = rel_push_select(sql, r, e->l, e); + } + if (nr) + rel->l = nr; + /* only pushed down selects are counted */ + if (r == rel->l) { + (*changes)++; + } else { /* Do not introduce an extra select */ + sql_rel *r = rel->l; + + rel->l = r->l; + r->l = NULL; + list_append(rel->exps, e); + rel_destroy(r); + } + assert(r == rel->l); + } else { + list_append(rel->exps, e); + } + } + return rel; + } + return rel; +} ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: out2in - Add semantics flag for functions.
Changeset: a1be8b1e8538 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a1be8b1e8538 Modified Files: sql/common/sql_types.c sql/include/sql_catalog.h sql/server/rel_exp.c sql/storage/store.c Branch: out2in Log Message: Add semantics flag for functions. diffs (truncated from 913 to 300 lines): diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -1020,7 +1020,7 @@ sql_create_arg(sql_allocator *sa, const } static sql_func * -sql_create_func_(sql_allocator *sa, const char *name, const char *mod, const char *imp, sql_ftype type, bit side_effect, +sql_create_func_(sql_allocator *sa, const char *name, const char *mod, const char *imp, sql_ftype type, bit semantics, bit side_effect, int fix_scale, unsigned int res_scale, sql_type *res, int nargs, va_list valist) { list *ops = sa_list(sa); @@ -1034,6 +1034,7 @@ sql_create_func_(sql_allocator *sa, cons if (res) fres = create_arg(sa, NULL, sql_create_subtype(sa, res, 0, 0), ARG_OUT); base_init(sa, &t->base, store_next_oid(), 0, name); + t->imp = sa_strdup(sa, imp); t->mod = sa_strdup(sa, mod); t->ops = ops; @@ -1047,6 +1048,7 @@ sql_create_func_(sql_allocator *sa, cons t->nr = list_length(funcs); t->sql = 0; t->lang = FUNC_LANG_INT; + t->semantics = semantics; t->side_effect = side_effect; t->fix_scale = fix_scale; t->s = NULL; @@ -1066,32 +1068,32 @@ sql_create_procedure(sql_allocator *sa, va_list valist; va_start(valist, nargs); - res = sql_create_func_(sa, name, mod, imp, F_PROC, side_effect, SCALE_NONE, 0, NULL, nargs, valist); + res = sql_create_func_(sa, name, mod, imp, F_PROC, TRUE, side_effect, SCALE_NONE, 0, NULL, nargs, valist); va_end(valist); return res; } static sql_func * -sql_create_func(sql_allocator *sa, const char *name, const char *mod, const char *imp, bit side_effect, int fix_scale, +sql_create_func(sql_allocator *sa, const char *name, const char *mod, const char *imp, bit semantics, bit side_effect, int fix_scale, unsigned int res_scale, sql_type *fres, int nargs, ...) { sql_func *res; va_list valist; va_start(valist, nargs); - res = sql_create_func_(sa, name, mod, imp, F_FUNC, side_effect, fix_scale, res_scale, fres, nargs, valist); + res = sql_create_func_(sa, name, mod, imp, F_FUNC, semantics, side_effect, fix_scale, res_scale, fres, nargs, valist); va_end(valist); return res; } static sql_func * -sql_create_aggr(sql_allocator *sa, const char *name, const char *mod, const char *imp, sql_type *fres, int nargs, ...) +sql_create_aggr(sql_allocator *sa, const char *name, const char *mod, const char *imp, bit semantics, sql_type *fres, int nargs, ...) { sql_func *res; va_list valist; va_start(valist, nargs); - res = sql_create_func_(sa, name, mod, imp, F_AGGR, FALSE, SCALE_NONE, 0, fres, nargs, valist); + res = sql_create_func_(sa, name, mod, imp, F_AGGR, semantics, FALSE, SCALE_NONE, 0, fres, nargs, valist); va_end(valist); return res; } @@ -1104,7 +1106,7 @@ sql_create_union(sql_allocator *sa, cons va_list valist; va_start(valist, nargs); - res = sql_create_func_(sa, name, mod, imp, F_UNION, side_effect, fix_scale, res_scale, fres, nargs, valist); + res = sql_create_func_(sa, name, mod, imp, F_UNION, TRUE, side_effect, fix_scale, res_scale, fres, nargs, valist); va_end(valist); return res; } @@ -1116,7 +1118,7 @@ sql_create_analytic(sql_allocator *sa, c va_list valist; va_start(valist, nargs); - res = sql_create_func_(sa, name, mod, imp, F_ANALYTIC, FALSE, fix_scale, 0, fres, nargs, valist); + res = sql_create_func_(sa, name, mod, imp, F_ANALYTIC, TRUE, FALSE, fix_scale, 0, fres, nargs, valist); va_end(valist); return res; } @@ -1220,8 +1222,8 @@ sqltypeinit( sql_allocator *sa) BLOB = *t++ = sql_create_type(sa, "BLOB", 0, 0, 0, EC_BLOB, "blob"); - sql_create_func(sa, "length", "blob", "nitems", FALSE, SCALE_NONE, 0, INT, 1, BLOB); - sql_create_func(sa, "octet_length", "blob", "nitems", FALSE, SCALE_NONE, 0, INT, 1, BLOB); + sql_create_func(sa, "length", "blob", "nitems", FALSE, FALSE, SCALE_NONE, 0, INT, 1, BLOB); + sql_create_func(sa, "octet_length", "blob", "nitems", FALSE, FALSE, SCALE_NONE, 0, INT, 1, BLOB); if (geomcatalogfix_get() != NULL) { // the geom module is loaded @@ -1232,36 +1234,36 @@ sqltypeinit( sql_allocator *sa) MBR = *t++ = sql_create_type(sa, "MBR", 0, SCALE_NONE, 0, EC_EXTERNAL, "mbr"); /* mbr operator functions */
MonetDB: out2in - 'is not' is apparently 'semantics' + 'cmp_equa...
Changeset: a90d6473c5aa for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a90d6473c5aa Modified Files: sql/server/rel_exp.c Branch: out2in Log Message: 'is not' is apparently 'semantics' + 'cmp_equal' + 'anti'. diffs (19 lines): diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c --- a/sql/server/rel_exp.c +++ b/sql/server/rel_exp.c @@ -1612,11 +1612,11 @@ exp_is_cmp_exp_is_false(mvc *sql, sql_ex /* Handle 'v is x' and 'v is not x' expressions. * Other cases in is-semantics are unspecified. */ -if (e->flag == cmp_equal) { -return (exp_is_null(sql, l) != exp_is_null(sql, r)); +if (e->flag == cmp_equal && !e->anti) { +return (exp_is_null(sql, l) && exp_is_null(sql, r)); } -if (e->flag == cmp_notequal) { -return (exp_is_null(sql, l) == exp_is_null(sql, r)); +if (((e->flag == cmp_notequal) && !e->anti) || ((e->flag == cmp_equal) && e->anti) ) { +return ((exp_is_null(sql, l) && exp_is_not_null(sql, r))) || ((exp_is_not_null(sql, l) && exp_is_null(sql, r))); } return false; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Approved test output, ie cannot create system...
Changeset: 296d3b75b682 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=296d3b75b682 Modified Files: sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err Branch: default Log Message: Approved test output, ie cannot create system tables on readonly mode diffs (12 lines): diff --git a/sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err b/sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err --- a/sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err +++ b/sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err @@ -64,6 +64,8 @@ stderr of test 'new-readonly-db.Bug-2695 # cmdline opt mal_listing = 2 # cmdline opt gdk_dbname = mTests_src_test_BugTracker-2010-2695 # cmdline opt gdk_readonly = yes +2020-03-11 14:03:29 ../../../src/sql/server/sql_mvc.c:146 mvc_init M_CRITICAL SQL_TRANSmain thread # Unable to create system tables +2020-03-11 14:03:29 ../../../../src/sql/backends/monet5/sql_scenario.c:139 SQLprelude M_CRITICAL SQL_PARSER main thread # Fatal error during initialization: SQLException:SQLinit:42000!Catalogue initialization failed # 12:51:24 > # 12:51:24 > Done. ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: mosaic - Fix testweb compilation and add pound sign to ...
Changeset: 9d37b656b5ad for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9d37b656b5ad Modified Files: gdk/gdk_mosaic.c gdk/gdk_mosaic_templates.h Branch: mosaic Log Message: Fix testweb compilation and add pound sign to debug messages. diffs (74 lines): diff --git a/gdk/gdk_mosaic.c b/gdk/gdk_mosaic.c --- a/gdk/gdk_mosaic.c +++ b/gdk/gdk_mosaic.c @@ -14,7 +14,7 @@ #include "gdk.h" #include "gdk_private.h" -#define EXT(HEAP) ("t" STRINGIFY(HEAP)) +#define EXT(HEAP) "t" STRINGIFY(HEAP) #define HEAP mosaic #include "gdk_mosaic_templates.h" diff --git a/gdk/gdk_mosaic_templates.h b/gdk/gdk_mosaic_templates.h --- a/gdk/gdk_mosaic_templates.h +++ b/gdk/gdk_mosaic_templates.h @@ -46,7 +46,7 @@ CONCAT3(MOS_, HEAP, _sync)(void *arg) failed = ""; /* not failed */ } } - TRC_DEBUG(ACCELERATOR, STRINGIFY(CONCAT3(MOS_, HEAP, _sync)) "(%s): " STRINGIFY(HEAP) " index persisted" + TRC_DEBUG(ACCELERATOR, "#" STRINGIFY(CONCAT3(MOS_, HEAP, _sync)) "(%s): " STRINGIFY(HEAP) " index persisted" " (" LLFMT " usec)%s\n", BATgetId(b), GDKusec() - t0, failed); } @@ -65,10 +65,12 @@ CONCAT3(create_, HEAP, _heap)(BAT *b, BU Heap *m; const char *nme; + + const char* ext = "." EXT(HEAP); nme = GDKinmemory() ? ":inmemory" : BBP_physical(b->batCacheid); if ((m = GDKzalloc(sizeof(Heap))) == NULL || (m->farmid = BBPselectfarm(b->batRole, b->ttype, mosaicheap)) < 0 || - sprintf(m->filename, "%s.%s", nme, EXT(HEAP)) >= (int) sizeof(m->filename) || + strconcat_len(m->filename, sizeof(m->filename), nme, ext, NULL) >= sizeof(m->filename) || HEAPalloc(m, cap, Tsize(b)) != GDK_SUCCEED) { GDKfree(m); return NULL; @@ -93,7 +95,7 @@ CONCAT2(persist_, HEAP)(BAT *b) MT_THR_DETACHED, name) < 0) BBPunfix(b->batCacheid); } else - TRC_DEBUG(ACCELERATOR, STRINGIFY(CONCAT2(persist, HEAP)) "(" ALGOBATFMT "): NOT persisting " STRINGIFY(HEAP) " index\n", ALGOBATPAR(b)); + TRC_DEBUG(ACCELERATOR, "#" STRINGIFY(CONCAT2(persist, HEAP)) "(" ALGOBATFMT "): NOT persisting " STRINGIFY(HEAP) " index\n", ALGOBATPAR(b)); #else (void) b; #endif @@ -170,15 +172,14 @@ CONCAT2(MOScheck_, HEAP)(BAT *b) if (b->CONCAT2(t, HEAP) == (Heap *) 1) { Heap *hp; const char *nme = BBP_physical(b->batCacheid); - const char *ext = EXT(HEAP); int fd; b->CONCAT2(t, HEAP) = NULL; if ((hp = GDKzalloc(sizeof(*hp))) != NULL && (hp->farmid = BBPselectfarm(b->batRole, b->ttype, mosaicheap)) >= 0 ){ - - sprintf(hp->filename, "%s.%s", nme, ext); + const char* ext = "." EXT(HEAP); + strconcat_len(hp->filename, sizeof(hp->filename), nme, ext, NULL); /* check whether a persisted mosaic-specific heap can be found */ if ((fd = GDKfdlocate(hp->farmid, nme, "rb+", ext)) >= 0) { @@ -195,7 +196,7 @@ CONCAT2(MOScheck_, HEAP)(BAT *b) { close(fd); hp->parentid = b->batCacheid; - TRC_DEBUG(ALGO, "#BATcheckmosaic %s: reusing persisted heap %d\n", ext, b->batCacheid); + TRC_DEBUG(ALGO, "#" STRINGIFY(CONCAT2(MOScheck_, HEAP)) " %s: reusing persisted heap %d\n", ext, b->batCacheid); b->CONCAT2(t, HEAP) = hp; return 1; } ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: mosaic - Get rid of lock wrapper.
Changeset: 642371d91257 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=642371d91257 Modified Files: clients/Tests/exports.stable.out gdk/gdk.h gdk/gdk_mosaic.c Branch: mosaic Log Message: Get rid of lock wrapper. diffs (43 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -343,8 +343,6 @@ Heap *MOScreate_vmosaic_heap(BAT *b, BUN void MOSdestroy(BAT *b); void MOSfree(BAT *bn); void MOSpersist(BAT *b); -void MOSsetLock(BAT *b); -void MOSunsetLock(BAT *b); void MOSvirtualize(BAT *bn); int MT_check_nr_cores(void); int MT_create_thread(MT_Id *t, void (*function)(void *), void *arg, enum MT_thr_detach d, const char *threadname); diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1628,8 +1628,6 @@ gdk_export int BATcheckmosaic(BAT *b); gdk_export void MOSdestroy(BAT *b); gdk_export void MOSfree(BAT *bn); gdk_export void MOSpersist(BAT *b); -gdk_export void MOSsetLock(BAT* b); -gdk_export void MOSunsetLock(BAT* b); gdk_export void MOSvirtualize(BAT *bn); /* diff --git a/gdk/gdk_mosaic.c b/gdk/gdk_mosaic.c --- a/gdk/gdk_mosaic.c +++ b/gdk/gdk_mosaic.c @@ -14,15 +14,6 @@ #include "gdk.h" #include "gdk_private.h" -void MOSsetLock(BAT* b) { - MT_lock_set(&b->batIdxLock); -} - -void MOSunsetLock(BAT* b) { - MT_lock_unset(&b->batIdxLock); -} - - #define EXT(HEAP) ("t" STRINGIFY(HEAP)) #define HEAP mosaic ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Nov2019 - Added support for SQL_LONGVARCHAR, SQL_CHAR a...
Changeset: b9d237043e33 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b9d237043e33 Modified Files: clients/odbc/driver/SQLGetTypeInfo.c Branch: Nov2019 Log Message: Added support for SQL_LONGVARCHAR, SQL_CHAR and SQL_VARCHAR in SQLGetTypeInfo. diffs (truncated from 1512 to 300 lines): diff --git a/clients/odbc/driver/SQLGetTypeInfo.c b/clients/odbc/driver/SQLGetTypeInfo.c --- a/clients/odbc/driver/SQLGetTypeInfo.c +++ b/clients/odbc/driver/SQLGetTypeInfo.c @@ -57,761 +57,824 @@ static const struct types { * Except for the type_name value, the string values are ready * to paste into an SQL query (i.e. including quotes). */ { - "uuid", /* type_name */ - SQL_GUID, /* data_type */ - 36, /* column_size */ - "NULL", /* literal_prefix */ - "NULL", /* literal_suffix */ - "NULL", /* create_params */ - SQL_NULLABLE, /* nullable */ - SQL_FALSE, /* case_sensitive */ - SQL_PRED_BASIC, /* searchable */ - -1, /* unsigned_attribute */ - SQL_FALSE, /* fixed_prec_scale */ - -1, /* auto_unique_value */ - "NULL", /* local_type_name */ - -1, /* minimum_scale */ - -1, /* maximum_scale */ - SQL_GUID, /* sql_data_type */ - -1, /* sql_datetime_sub */ - -1, /* num_prec_radix */ - -1, /* interval_precision */ + .type_name = "uuid", + .data_type = SQL_GUID, + .column_size = 36, + .literal_prefix = "NULL", + .literal_suffix = "NULL", + .create_params = "NULL", + .nullable = SQL_NULLABLE, + .case_sensitive = SQL_FALSE, + .searchable = SQL_PRED_BASIC, + .unsigned_attribute = -1, + .fixed_prec_scale = SQL_FALSE, + .auto_unique_value = -1, + .local_type_name = "NULL", + .minimum_scale = -1, + .maximum_scale = -1, + .sql_data_type = SQL_GUID, + .sql_datetime_sub = -1, + .num_prec_radix = -1, + .interval_precision = -1, }, { - "character large object", /* type_name */ - SQL_WLONGVARCHAR, /* data_type */ - 100,/* column_size */ - "", /* literal_prefix */ - "", /* literal_suffix */ - "NULL", /* create_params */ - SQL_NULLABLE, /* nullable */ - SQL_TRUE, /* case_sensitive */ - SQL_SEARCHABLE, /* searchable */ - -1, /* unsigned_attribute */ - SQL_FALSE, /* fixed_prec_scale */ - SQL_FALSE, /* auto_unique_value */ - "NULL", /* local_type_name */ - -1, /* minimum_scale */ - -1, /* maximum_scale */ - SQL_WLONGVARCHAR, /* sql_data_type */ - -1, /* sql_datetime_sub */ - -1, /* num_prec_radix */ - -1, /* interval_precision */ + .type_name = "character large object", + .data_type = SQL_WLONGVARCHAR, + .column_size = 100, + .literal_prefix = "", + .literal_suffix = "", + .create_params = "NULL", + .nullable = SQL_NULLABLE, + .case_sensitive = SQL_TRUE, + .searchable = SQL_SEARCHABLE, + .unsigned_attribute = -1, + .fixed_prec_scale = SQL_FALSE, + .auto_unique_value = SQL_FALSE, + .local_type_name = "NULL", + .minimum_scale = -1, + .maximum_scale = -1, + .sql_data_type = SQL_WLONGVARCHAR, + .sql_datetime_sub = -1, + .num_prec_radix = -1, + .interval_precision = -1, }, { - "varchar", /* type_name */ - SQL_WVARCHAR, /* data_type */ - 100,/* column_size */ - "", /* literal_prefix */ - "", /* literal_suffix */ - "'length'", /* create_params */ -
MonetDB: default - Removed unused macros
Changeset: c0d5b4c3a973 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c0d5b4c3a973 Modified Files: sql/server/rel_rel.h Branch: default Log Message: Removed unused macros diffs (19 lines): diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -28,7 +28,6 @@ #define sql_update_set (1 << 12) //ORed #define sql_values (1 << 13) //ORed #define psm_call (1 << 14) //ORed -#define sql_rel_update (1 << 15) //ORed #define is_sql_from(X) ((X & sql_from) == sql_from) #define is_sql_where(X)((X & sql_where) == sql_where) @@ -45,7 +44,6 @@ #define is_sql_update_set(X) ((X & sql_update_set) == sql_update_set) #define is_sql_values(X) ((X & sql_values) == sql_values) #define is_psm_call(X) ((X & psm_call) == psm_call) -#define is_sql_rel_update(X) ((X & sql_rel_update) == sql_rel_update) #define is_updateble(rel) \ (rel->op == op_basetable || \ ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Updates with wrong results
Changeset: c65827333031 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c65827333031 Modified Files: sql/server/rel_propagate.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_updates.c sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err Branch: default Log Message: Updates with wrong results diffs (107 lines): diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c --- a/sql/server/rel_propagate.c +++ b/sql/server/rel_propagate.c @@ -160,7 +160,7 @@ generate_partition_limits(sql_query *que return exp_atom(sql->sa, amax); } else { exp_kind ek = {type_value, card_value, FALSE}; - sql_exp *e = rel_value_exp2(query, r, s, sql_sel | sql_values, ek); + sql_exp *e = rel_value_exp2(query, r, s, sql_sel | sql_values, ek); if (!e) return NULL; diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -28,6 +28,7 @@ #define sql_update_set (1 << 12) //ORed #define sql_values (1 << 13) //ORed #define psm_call (1 << 14) //ORed +#define sql_rel_update (1 << 15) //ORed #define is_sql_from(X) ((X & sql_from) == sql_from) #define is_sql_where(X)((X & sql_where) == sql_where) @@ -44,6 +45,7 @@ #define is_sql_update_set(X) ((X & sql_update_set) == sql_update_set) #define is_sql_values(X) ((X & sql_values) == sql_values) #define is_psm_call(X) ((X & psm_call) == psm_call) +#define is_sql_rel_update(X) ((X & sql_rel_update) == sql_rel_update) #define is_updateble(rel) \ (rel->op == op_basetable || \ diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -2380,7 +2380,7 @@ rel_logical_value_exp(sql_query *query, return NULL; if (ek.card <= card_set && is_project(sq->op) && list_length(sq->exps) > 1) return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery must return only one column"); - if (ek.card < card_set && sq->card >= CARD_MULTI && is_sql_sel(f) && (*rel && is_basetable((*rel)->op))) + if (ek.card < card_set && sq->card >= CARD_MULTI && is_sql_sel(f) && (rel && *rel && is_basetable((*rel)->op))) sq = rel_zero_or_one(sql, sq, ek); return exp_rel(sql, sq); } diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -990,7 +990,7 @@ update_generate_assignments(sql_query *q if (single) { v = rel_value_exp(query, &r, a, sql_sel | sql_update_set, ek); } else if (!rel_val && r) { - query_push_outer(query, r, sql_sel | sql_update_set); + query_push_outer(query, r, sql_sel); rel_val = rel_subquery(query, NULL, a, ek); r = query_pop_outer(query); if (/* DISABLES CODE */ (0) && r) { diff --git a/sql/test/subquery/Tests/subquery4.sql b/sql/test/subquery/Tests/subquery4.sql --- a/sql/test/subquery/Tests/subquery4.sql +++ b/sql/test/subquery/Tests/subquery4.sql @@ -141,6 +141,11 @@ DELETE FROM another_T WHERE col1 = AVG(c DELETE FROM another_T WHERE col7 = (SELECT SUM(col3) OVER ()); --0 rows affected DELETE FROM another_T WHERE col8 = (SELECT MAX(col6 + ColID) OVER () FROM tbl_ProductSales); --error, more than one row returned by a subquery used as an expression +UPDATE another_T SET col5 = (SELECT 1 UNION ALL SELECT 2); --error, more than one row returned by a subquery used as an expression +UPDATE another_T SET col5 = 1 WHERE col5 = (SELECT 1 UNION ALL SELECT 2); --error, more than one row returned by a subquery used as an expression +DELETE FROM another_T WHERE col1 = (SELECT 1 UNION ALL SELECT 2); --error, more than one row returned by a subquery used as an expression +INSERT INTO another_T VALUES ((SELECT 1 UNION ALL SELECT 2),2,3,4,5,6,7,8); --error, more than one row returned by a subquery used as an expression + DECLARE x int; SET x = MAX(1) over (); --error, not allowed DECLARE y int; @@ -149,7 +154,7 @@ SET y = MIN(1); --error, not allowed INSERT INTO another_T VALUES (SUM(1),2,3,4,5,6,7,8); --error, not allowed INSERT INTO another_T VALUES (AVG(1) OVER (),2,3,4,5,6,7,8); --error, not allowed INSERT INTO another_T VALUES ((SELECT SUM(1)),(SELECT SUM(2) OVER ()),3,4,5,6,7,8); --allowed - + SELECT * FROM another_T; CREATE PROCEDURE crashme(a int) BEGIN DECLARE x INT; SET x = a; END; diff --git a/sql/test/subquery/Tests/subquery4.stable.err b/sql/test/subqu
MonetDB: pushdown - merged
Changeset: c5ded6b6a072 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c5ded6b6a072 Modified Files: sql/backends/monet5/sql.c sql/include/sql_relation.h sql/server/rel_rel.c sql/server/rel_select.c sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.stable.err sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-coalesce-error-message.Bug-6608.stable.err sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.out Branch: pushdown Log Message: merged diffs (truncated from 429 to 300 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -5668,11 +5668,15 @@ SQLunionfunc(Client cntxt, MalBlkPtr mb, ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY005) "Cannot access column descriptor"); else { ccnt = BATcount(fres); - BAT *p = NULL; - - if (BATappend(res[0], p = BATconstant(fres->hseqbase, res[0]->ttype, (ptr)BUNtail(bi[0], cur), ccnt, 0), NULL, FALSE) != GDK_SUCCEED) - ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); - BBPunfix(p->batCacheid); + BAT *p = BATconstant(fres->hseqbase, res[0]->ttype, (ptr)BUNtail(bi[0], cur), ccnt, 0); + + if (p) { + if (BATappend(res[0], p, NULL, FALSE) != GDK_SUCCEED) + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + BBPunfix(p->batCacheid); + } else { + ret = createException(MAL, "sql.unionfunc", OPERATION_FAILED); + } BBPunfix(fres->batCacheid); } i=1; diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -267,6 +267,7 @@ typedef struct relation { dependent:1, /* dependent join */ distinct:1, processed:1, /* fully processed or still in the process of building */ +grouped:1, /* groupby processed all the group by exps */ subquery:1;/* is this part a subquery, this is needed for proper name binding */ void *p;/* properties for the optimizer, distribution */ } sql_rel; diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -900,6 +900,7 @@ rel_groupby(mvc *sql, sql_rel *l, list * rel->exps = aggrs; rel->nrcols = l->nrcols; rel->op = op_groupby; + rel->grouped = 1; return rel; } diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -2858,40 +2858,16 @@ rel_unop(sql_query *query, sql_rel **rel exp_kind iek = {type_value, card_column, FALSE}; sql_exp *e = NULL; sql_subfunc *sf = NULL; - sql_ftype type = (ek.card == card_loader)?F_LOADER:((ek.card == card_none)?F_PROC:F_FUNC); if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "SELECT: no such schema '%s'", sname); + sf = find_func(sql, s, fname, 1, F_AGGR, NULL); + if (sf) + return rel_aggr(query, rel, se, f); + e = rel_value_exp(query, rel, l->next->next->data.sym, f|sql_farg, iek); if (!e) - sf = find_func(sql, s, fname, 1, F_AGGR, NULL); - - if (!sf && !e && *rel && (*rel)->card == CARD_AGGR) { - if (is_sql_having(f) || is_sql_orderby(f)) - return NULL; - /* reset error */ - sql->session->status = 0; - sql->errstr[0] = '\0'; - return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no such aggregate '%s'", fname); - } - if (!e && sf) { /* possibly we cannot resolve the argument as the function maybe an aggregate */ - /* reset error */ - sql->session->status = 0; - sql->errstr[0] = '\0'; - return rel_
MonetDB: default - fixed proper use of nested aggregation
Changeset: ce47a38f5294 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ce47a38f5294 Modified Files: sql/include/sql_relation.h sql/server/rel_rel.c sql/server/rel_select.c sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.stable.err sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-coalesce-error-message.Bug-6608.stable.err sql/test/subquery/Tests/subquery4.stable.out Branch: default Log Message: fixed proper use of nested aggregation reduced complexity in the rel_unop, rel_binop and rel_nop cases, ie first try if we have an aggregation function with the required number of arguments, iff so continue with rel_aggr else continue in the functional route. diffs (truncated from 301 to 300 lines): diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h --- a/sql/include/sql_relation.h +++ b/sql/include/sql_relation.h @@ -267,6 +267,7 @@ typedef struct relation { dependent:1, /* dependent join */ distinct:1, processed:1, /* fully processed or still in the process of building */ +grouped:1, /* groupby processed all the group by exps */ subquery:1;/* is this part a subquery, this is needed for proper name binding */ void *p;/* properties for the optimizer, distribution */ } sql_rel; diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -900,6 +900,7 @@ rel_groupby(mvc *sql, sql_rel *l, list * rel->exps = aggrs; rel->nrcols = l->nrcols; rel->op = op_groupby; + rel->grouped = 1; return rel; } diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -2858,40 +2858,16 @@ rel_unop(sql_query *query, sql_rel **rel exp_kind iek = {type_value, card_column, FALSE}; sql_exp *e = NULL; sql_subfunc *sf = NULL; - sql_ftype type = (ek.card == card_loader)?F_LOADER:((ek.card == card_none)?F_PROC:F_FUNC); if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "SELECT: no such schema '%s'", sname); + sf = find_func(sql, s, fname, 1, F_AGGR, NULL); + if (sf) + return rel_aggr(query, rel, se, f); + e = rel_value_exp(query, rel, l->next->next->data.sym, f|sql_farg, iek); if (!e) - sf = find_func(sql, s, fname, 1, F_AGGR, NULL); - - if (!sf && !e && *rel && (*rel)->card == CARD_AGGR) { - if (is_sql_having(f) || is_sql_orderby(f)) - return NULL; - /* reset error */ - sql->session->status = 0; - sql->errstr[0] = '\0'; - return sql_error(sql, 02, SQLSTATE(42000) "SELECT: no such aggregate '%s'", fname); - } - if (!e && sf) { /* possibly we cannot resolve the argument as the function maybe an aggregate */ - /* reset error */ - sql->session->status = 0; - sql->errstr[0] = '\0'; - return rel_aggr(query, rel, se, f); - } - if (type == F_FUNC) { - sf = find_func(sql, s, fname, 1, F_AGGR, NULL); - if (sf) { - if (!e) { /* reset error */ - sql->session->status = 0; - sql->errstr[0] = '\0'; - } - return _rel_aggr(query, rel, l->next->data.i_val, s, fname, l->next->next, f); - } - } - if (!e) return NULL; return rel_unop_(sql, rel ? *rel : NULL, e, s, fname, ek.card); } @@ -3137,42 +3113,17 @@ rel_binop(sql_query *query, sql_rel **re char *sname = qname_schema(dl->data.lval); sql_schema *s = cur_schema(sql); exp_kind iek = {type_value, card_column, FALSE}; - sql_ftype type = (ek.card == card_loader)?F_LOADER:((ek.card == card_none)?F_PROC:F_FUNC); sql_subfunc *sf = NULL; if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "SELECT: no such schema '%s'", sname); + sf = find_func(sql, s, fname, 2, F_AGGR, NULL); + if (sf) + return rel_aggr(query, rel, se, f); + l = rel_value_exp(query, rel, dl->next->next->data.sym, f|sql_farg, iek); r = rel_value_exp(query, rel, dl->next->next->next->data.sym, f|sql_farg, iek); - - if (!l || !r) - sf = find_func(sql, s, fname, 2, F_AGGR, NULL); - if (!sf && (!l || !r) && *rel && (*rel)->card == CARD_AGGR) { - if (mvc_status(sql) || is_sql_having(f) || is_sql_orderby(f)) - return NULL; - /* reset error */ - sql->session->status = 0; - sql->errstr[0] = '\0'; - return
MonetDB: default - Approved output
Changeset: 916c851736c6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=916c851736c6 Modified Files: sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.out Branch: default Log Message: Approved output diffs (112 lines): diff --git a/sql/test/subquery/Tests/subquery4.sql b/sql/test/subquery/Tests/subquery4.sql --- a/sql/test/subquery/Tests/subquery4.sql +++ b/sql/test/subquery/Tests/subquery4.sql @@ -105,7 +105,14 @@ FROM integers i1; UPDATE another_T SET col1 = MIN(col1); --error, aggregates not allowed in update set clause UPDATE another_T SET col2 = 1 WHERE col1 = SUM(col2); --error, aggregates not allowed in update set clause UPDATE another_T SET col3 = (SELECT MAX(col5)); --error, aggregates not allowed in update set clause -UPDATE another_T SET col4 = (SELECT SUM(col4 + ColID) FROM tbl_ProductSales); +UPDATE another_T SET col4 = (SELECT SUM(col4 + ColID) FROM tbl_ProductSales); --4 rows affected + +SELECT col4 FROM another_T; + -- 26 + -- 186 + -- 1786 + -- 17786 + UPDATE another_T SET col5 = 1 WHERE col5 = (SELECT AVG(col2)); --error, aggregates not allowed in where clause UPDATE another_T SET col6 = 1 WHERE col6 = (SELECT COUNT(col3 + ColID) FROM tbl_ProductSales); UPDATE another_T SET col8 = (SELECT 1 FROM integers i2 WHERE AVG(i2.i)); --error, aggregates not allowed in update set clause @@ -113,18 +120,25 @@ UPDATE another_T SET col7 = 1 WHERE col5 DELETE FROM another_T WHERE col1 = COUNT(col2); --error, aggregates not allowed in where clause DELETE FROM another_T WHERE col7 = (SELECT MIN(col3)); --error, aggregates not allowed in where clause -DELETE FROM another_T WHERE col8 = (SELECT AVG(col6 + ColID) FROM tbl_ProductSales); +DELETE FROM another_T WHERE col8 = (SELECT AVG(col6 + ColID) FROM tbl_ProductSales); --0 rows affected DELETE FROM another_T WHERE col2 = (SELECT 1 FROM integers i2 WHERE AVG(i2.i)); --error, aggregates not allowed in where clause UPDATE another_T SET col1 = AVG(col1) OVER (); --error, window functions not allowed in update set clause UPDATE another_T SET col2 = 1 WHERE col1 = COUNT(col2) OVER (); --error, window functions not allowed in where clause -UPDATE another_T SET col3 = (SELECT SUM(col5) OVER ()); +UPDATE another_T SET col3 = (SELECT SUM(col5) OVER ()); --4 rows affected + +SELECT col3 FROM another_T; + -- 5 + -- 55 + -- 555 + -- + UPDATE another_T SET col4 = (SELECT MIN(col4 + ColID) OVER () FROM tbl_ProductSales); --error, more than one row returned by a subquery used as an expression -UPDATE another_T SET col5 = 1 WHERE col5 = (SELECT MAX(col2) OVER ()); +UPDATE another_T SET col5 = 1 WHERE col5 = (SELECT MAX(col2) OVER ()); --0 rows affected UPDATE another_T SET col6 = 1 WHERE col6 = (SELECT MIN(col3 + ColID) OVER () FROM tbl_ProductSales); --error, more than one row returned by a subquery used as an expression DELETE FROM another_T WHERE col1 = AVG(col2) OVER (); --error, window functions not allowed in where clause -DELETE FROM another_T WHERE col7 = (SELECT SUM(col3) OVER ()); +DELETE FROM another_T WHERE col7 = (SELECT SUM(col3) OVER ()); --0 rows affected DELETE FROM another_T WHERE col8 = (SELECT MAX(col6 + ColID) OVER () FROM tbl_ProductSales); --error, more than one row returned by a subquery used as an expression DECLARE x int; @@ -134,6 +148,9 @@ SET y = MIN(1); --error, not allowed INSERT INTO another_T VALUES (SUM(1),2,3,4,5,6,7,8); --error, not allowed INSERT INTO another_T VALUES (AVG(1) OVER (),2,3,4,5,6,7,8); --error, not allowed +INSERT INTO another_T VALUES ((SELECT SUM(1)),(SELECT SUM(2) OVER ()),3,4,5,6,7,8); --allowed + +SELECT * FROM another_T; CREATE PROCEDURE crashme(a int) BEGIN DECLARE x INT; SET x = a; END; diff --git a/sql/test/subquery/Tests/subquery4.stable.out b/sql/test/subquery/Tests/subquery4.stable.out --- a/sql/test/subquery/Tests/subquery4.stable.out +++ b/sql/test/subquery/Tests/subquery4.stable.out @@ -137,18 +137,48 @@ stdout of test 'subquery4` in directory [ 3] #UPDATE another_T SET col4 = (SELECT SUM(col4 + ColID) FROM tbl_ProductSales); [ 4] +#SELECT col4 FROM another_T; +% sys.another_t # table_name +% col4 # name +% int # type +% 5 # length +[ 26 ] +[ 186 ] +[ 1786 ] +[ 17786] #UPDATE another_T SET col6 = 1 WHERE col6 = (SELECT COUNT(col3 + ColID) FROM tbl_ProductSales); [ 0] #DELETE FROM another_T WHERE col8 = (SELECT AVG(col6 + ColID) FROM tbl_ProductSales); [ 0] #UPDATE another_T SET col3 = (SELECT SUM(col5) OVER ()); [ 4] -#UPDATE another_T SET col5 = 1 WHERE col5 = (SELECT MAX(col2) OVER ()); +#SELECT col3 FROM another_T; +% sys.another_t # table_name +% col3 # name +% int # type +% 4 # length +[ 5] +[ 55 ] +[ 555 ] +[ ] +#UPDATE another_T SET col5 = 1 WHERE col5 = (SELECT MAX(col2) OVER ()); --0 rows affected [ 0] #DELETE FROM another_T WHERE col7 = (SELECT SUM
MonetDB: default - Defensive lines
Changeset: 748abc3d6ab3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=748abc3d6ab3 Modified Files: sql/backends/monet5/sql.c Branch: default Log Message: Defensive lines diffs (24 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -5668,11 +5668,15 @@ SQLunionfunc(Client cntxt, MalBlkPtr mb, ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY005) "Cannot access column descriptor"); else { ccnt = BATcount(fres); - BAT *p = NULL; - - if (BATappend(res[0], p = BATconstant(fres->hseqbase, res[0]->ttype, (ptr)BUNtail(bi[0], cur), ccnt, 0), NULL, FALSE) != GDK_SUCCEED) - ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); - BBPunfix(p->batCacheid); + BAT *p = BATconstant(fres->hseqbase, res[0]->ttype, (ptr)BUNtail(bi[0], cur), ccnt, 0); + + if (p) { + if (BATappend(res[0], p, NULL, FALSE) != GDK_SUCCEED) + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + BBPunfix(p->batCacheid); + } else { + ret = createException(MAL, "sql.unionfunc", OPERATION_FAILED); + } BBPunfix(fres->batCacheid); } i=1; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: pushdown - merged with default
Changeset: 56e77337f207 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=56e77337f207 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql.h sql/backends/monet5/sql.mal sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_unnest.c sql/test/subquery/Tests/subquery3.stable.err sql/test/subquery/Tests/subquery3.stable.out sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err sql/test/subquery/Tests/subquery4.stable.out Branch: pushdown Log Message: merged with default diffs (truncated from 859 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -18886,6 +18886,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "transaction_commit", "pattern sql.transaction_commit(chain:int, name:str):void ", "SQLtransaction_commit;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_release", "pattern sql.transaction_release(chain:int, name:str):void ", "SQLtransaction_release;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_rollback", "pattern sql.transaction_rollback(chain:int, name:str):void ", "SQLtransaction_rollback;", "A transaction statement (type can be commit,release,rollback or start)"] +[ "sql", "unionfunc","pattern sql.unionfunc(mod:str, fcn:str, X_0:any...):any... ", "SQLunionfunc;","" ] [ "sql", "update", "pattern sql.update(mvc:int, sname:str, tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)"] [ "sql", "update_schemas", "pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table"] [ "sql", "update_tables","pattern sql.update_tables():void ", "SYSupdate_tables;","Procedure triggered on update of the sys._tables table"] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -26900,6 +26900,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "transaction_commit", "pattern sql.transaction_commit(chain:int, name:str):void ", "SQLtransaction_commit;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_release", "pattern sql.transaction_release(chain:int, name:str):void ", "SQLtransaction_release;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_rollback", "pattern sql.transaction_rollback(chain:int, name:str):void ", "SQLtransaction_rollback;", "A transaction statement (type can be commit,release,rollback or start)"] +[ "sql", "unionfunc","pattern sql.unionfunc(mod:str, fcn:str, X_0:any...):any... ", "SQLunionfunc;","" ] [ "sql", "update", "pattern sql.update(mvc:int, sname:str, tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)"] [ "sql", "update_schemas", "pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table"] [ "sql", "update_tables","pattern sql.update_tables():void ", "SYSupdate_tables;","Procedure triggered on update of the sys._tables table"] 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 @@ -19,6 +19,8 @@ #include "rel_optimizer.h" #include "sql_env.h" #include "sql_optimizer.h" +#include "sql_gencode.h" +#include "mal_builder.h" #define OUTER_ZERO 64 @@ -538,6 +540,10 @@ exp_bin(backend *be, sql_exp *e, stmt *l for(n=lst->op4.lval->h; n; n = n->next) list_append(l, const_column(be, (stmt*)n->data)); r = stmt_list(be, l); + } else if (r->type == st_table && e->card == CARD_ATOM) { /* fetch value *
MonetDB: default - Moved assertion earlier and added defensive line
Changeset: 537f46c5dba6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=537f46c5dba6 Modified Files: sql/backends/monet5/rel_bin.c Branch: default Log Message: Moved assertion earlier and added defensive line diffs (29 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 @@ -1688,6 +1688,7 @@ rel2bin_table(backend *be, sql_rel *rel, return NULL; } + assert(f); if (f->func->res && list_length(f->func->res) + 1 == list_length(rel->exps) && !f->func->varres) { /* add inputs in correct order ie loop through args of f and pass column */ list *exps = op->l; @@ -1698,6 +1699,8 @@ rel2bin_table(backend *be, sql_rel *rel, /* find column */ stmt *s = exp_bin(be, e, sub, NULL, NULL, NULL, NULL, NULL); + if (!s) + return NULL; if (en->next) append(ops, s); else /* last added exp is the ids (todo use name base lookup !!) */ @@ -1706,7 +1709,7 @@ rel2bin_table(backend *be, sql_rel *rel, } } else { psub = exp_bin(be, op, sub, NULL, NULL, NULL, NULL, NULL); /* table function */ - if (!f || !psub) { + if (!psub) { assert(sql->session->status == -10); /* Stack overflow errors shouldn't terminate the server */ return NULL; } ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Initialize variable
Changeset: 27a59f5ff391 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=27a59f5ff391 Modified Files: sql/backends/monet5/sql.c Branch: default Log Message: Initialize variable diffs (12 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -5590,7 +5590,7 @@ SQLunionfunc(Client cntxt, MalBlkPtr mb, if (npci) { BAT **res = NULL, **input = NULL; - BATiter *bi; + BATiter *bi = NULL; BUN cnt = 0; int nrinput = pci->argc - 2 - pci->retc; MalBlkPtr nmb = NULL; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Look for allocation failures!
Changeset: ea5c4b02f83f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ea5c4b02f83f Modified Files: sql/backends/monet5/sql.c sql/test/subquery/Tests/subquery3.stable.out Branch: default Log Message: Look for allocation failures! diffs (216 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -5583,93 +5583,139 @@ SQLunionfunc(Client cntxt, MalBlkPtr mb, npci = pushNil(mb, npci, type); } /* check program to get the proper malblk */ - if (chkInstruction(cntxt->usermodule, mb, npci)) - return "ERORROR"; + if (chkInstruction(cntxt->usermodule, mb, npci)) { + freeInstruction(npci); + return createException(MAL, "sql.unionfunc", SQLSTATE(42000) PROGRAM_GENERAL); + } if (npci) { - BAT **res; - BAT **input; + BAT **res = NULL, **input = NULL; BATiter *bi; BUN cnt = 0; int nrinput = pci->argc - 2 - pci->retc; - - input = GDKmalloc(sizeof(BAT*) * nrinput); - bi = GDKmalloc(sizeof(BATiter) * nrinput); + MalBlkPtr nmb = NULL; + MalStkPtr env = NULL; + InstrPtr q = NULL; + + if (!(input = GDKzalloc(sizeof(BAT*) * nrinput))) { + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto finalize; + } + if (!(bi = GDKmalloc(sizeof(BATiter) * nrinput))) { + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto finalize; + } assert(nrinput == pci->retc); for (int i = 0, j = pci->retc+2; j < pci->argc; i++, j++) { bat *b = getArgReference_bat(stk, pci, j); - input[i] = BATdescriptor(*b); + if (!(input[i] = BATdescriptor(*b))) { + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY005) "Cannot access column descriptor"); + goto finalize; + } bi[i] = bat_iterator(input[i]); cnt = BATcount(input[i]); } /* create result bats */ - res = GDKmalloc(sizeof(BAT*) * pci->retc); + if (!(res = GDKzalloc(sizeof(BAT*) * pci->retc))) { + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto finalize; + } for (int i = 0; iretc; i++) { int type = getArgType(mb, pci, i); - res[i] = COLnew(0, getBatType(type), cnt, TRANSIENT); + if (!(res[i] = COLnew(0, getBatType(type), cnt, TRANSIENT))) { + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto finalize; + } } - MalBlkPtr nmb = copyMalBlk(npci->blk); - MalStkPtr env = prepareMALstack(nmb, nmb->vsize); /* needed for result */ - - InstrPtr q = getInstrPtr(nmb, 0); - - for(BUN cur = 0; curblk))) { + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto finalize; + } + if (!(env = prepareMALstack(nmb, nmb->vsize))) { /* needed for result */ + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto finalize; + } + + q = getInstrPtr(nmb, 0); + + for (BUN cur = 0; curvsize); int i,ii; - /* copy (input) arguments onto destination stack, skipping rowid col */ - for (i = 1, ii = q->retc; ii < q->argc; ii++) { - ValPtr lhs = &nstk->stk[q->argv[ii]]; - ptr rhs = (ptr)BUNtail(bi[i], cur); - - assert(lhs->vtype != TYPE_bat); - if (VALset(lhs, input[i]->ttype, rhs) == NULL) { - ret = createException(MAL, "mal.interpreter", MAL_MALLOC_FAIL); - break; + if (!nstk) { /* needed for result */ + ret = createException(MAL, "sql.unionfunc", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } else { + /* copy (input) arguments onto destination stack, skipping rowid col */ +
MonetDB: default - Throw better error message
Changeset: 2577c3740180 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2577c3740180 Modified Files: sql/server/rel_select.c sql/test/subquery/Tests/subquery4.stable.err Branch: default Log Message: Throw better error message diffs (28 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -2700,6 +2700,8 @@ rel_logical_exp(sql_query *query, sql_re sql_rel *sq = rel_setquery(query, sc); if (!sq) return NULL; + if (ek.card <= card_set && is_project(sq->op) && list_length(sq->exps) > 1) + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery must return only one column"); if (!rel) return sq; if (is_sql_where(f)) { diff --git a/sql/test/subquery/Tests/subquery4.stable.err b/sql/test/subquery/Tests/subquery4.stable.err --- a/sql/test/subquery/Tests/subquery4.stable.err +++ b/sql/test/subquery/Tests/subquery4.stable.err @@ -78,9 +78,9 @@ ERROR = !SELECT: subquery must return on CODE = 42000 MAPI = (monetdb) /var/tmp/mtest-675878/.s.monetdb.32460 QUERY = SELECT i FROM integers WHERE (SELECT true, false UNION ALL SELECT false, true); --error, subquery must return only one column -ERROR = !Cardinality violation, scalar value expected -CODE = 21000 -MAPI = (monetdb) /var/tmp/mtest-675878/.s.monetdb.32460 +ERROR = !SELECT: subquery must return only one column +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-6744/.s.monetdb.35025 QUERY = UPDATE another_T SET col1 = MIN(col1); --error, aggregates not allowed in update set clause ERROR = !MIN: aggregate functions not allowed in SET clause (use subquery) CODE = 42000 ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Return earlier from function on error
Changeset: fd5ee7a07b26 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fd5ee7a07b26 Modified Files: sql/backends/monet5/rel_bin.c Branch: default Log Message: Return earlier from function on error diffs (39 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 @@ -1503,7 +1503,7 @@ exp2bin_args(backend *be, sql_exp *e, li if (THRhighwater()) return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space"); - if (!e) + if (!e || !args) return args; switch(e->type){ case e_column: @@ -1540,7 +1540,7 @@ exp2bin_args(backend *be, sql_exp *e, li } else if (e->r) { char nme[64]; - snprintf(nme, 64, "A%s", (char*)e->r); + snprintf(nme, sizeof(nme), "A%s", (char*)e->r); if (!list_find(args, nme, (fcmp)&alias_cmp)) { stmt *s = stmt_var(be, e->r, &e->tpe, 0, 0); @@ -1550,7 +1550,7 @@ exp2bin_args(backend *be, sql_exp *e, li } else { char nme[16]; - snprintf(nme, 16, "A%u", e->flag); + snprintf(nme, sizeof(nme), "A%u", e->flag); if (!list_find(args, nme, (fcmp)&alias_cmp)) { atom *a = sql->args[e->flag]; stmt *s = stmt_varnr(be, e->flag, &a->tpe); @@ -1581,7 +1581,7 @@ rel2bin_args(backend *be, sql_rel *rel, if (THRhighwater()) return sql_error(be->mvc, 10, SQLSTATE(42000) "Query too complex: running out of stack space"); - if (!rel) + if (!rel || !args) return args; switch(rel->op) { case op_basetable: ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - merged
Changeset: 27c8efea0cbc for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=27c8efea0cbc Modified Files: sql/test/subquery/Tests/subquery4.sql Branch: default Log Message: merged diffs (15 lines): diff --git a/sql/test/subquery/Tests/subquery4.sql b/sql/test/subquery/Tests/subquery4.sql --- a/sql/test/subquery/Tests/subquery4.sql +++ b/sql/test/subquery/Tests/subquery4.sql @@ -97,6 +97,11 @@ SELECT i FROM integers WHERE (SELECT COU -- 2 -- 3 +SELECT + (SELECT MAX(i2.i) FROM (SELECT MIN(i1.i)) AS i2(i)) +FROM integers i1; + -- 1 + UPDATE another_T SET col1 = MIN(col1); --error, aggregates not allowed in update set clause UPDATE another_T SET col2 = 1 WHERE col1 = SUM(col2); --error, aggregates not allowed in update set clause UPDATE another_T SET col3 = (SELECT MAX(col5)); --error, aggregates not allowed in update set clause ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - handle unionfunctions more generaly now. Solv...
Changeset: e7e8b6c61a3b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e7e8b6c61a3b Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql.h sql/backends/monet5/sql.mal sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_unnest.c sql/test/subquery/Tests/subquery3.stable.err sql/test/subquery/Tests/subquery3.stable.out sql/test/subquery/Tests/subquery4.stable.err sql/test/subquery/Tests/subquery4.stable.out Branch: default Log Message: handle unionfunctions more generaly now. Solves issues with correlated table returning functions fixed problem with returning single values from psm functions where monetdb uses bats too represent the single value. added more checks for zero or one results diffs (truncated from 751 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -18886,6 +18886,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "transaction_commit", "pattern sql.transaction_commit(chain:int, name:str):void ", "SQLtransaction_commit;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_release", "pattern sql.transaction_release(chain:int, name:str):void ", "SQLtransaction_release;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_rollback", "pattern sql.transaction_rollback(chain:int, name:str):void ", "SQLtransaction_rollback;", "A transaction statement (type can be commit,release,rollback or start)"] +[ "sql", "unionfunc","pattern sql.unionfunc(mod:str, fcn:str, X_0:any...):any... ", "SQLunionfunc;","" ] [ "sql", "update", "pattern sql.update(mvc:int, sname:str, tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)"] [ "sql", "update_schemas", "pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table"] [ "sql", "update_tables","pattern sql.update_tables():void ", "SYSupdate_tables;","Procedure triggered on update of the sys._tables table"] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -26900,6 +26900,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "transaction_commit", "pattern sql.transaction_commit(chain:int, name:str):void ", "SQLtransaction_commit;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_release", "pattern sql.transaction_release(chain:int, name:str):void ", "SQLtransaction_release;", "A transaction statement (type can be commit,release,rollback or start)"] [ "sql", "transaction_rollback", "pattern sql.transaction_rollback(chain:int, name:str):void ", "SQLtransaction_rollback;", "A transaction statement (type can be commit,release,rollback or start)"] +[ "sql", "unionfunc","pattern sql.unionfunc(mod:str, fcn:str, X_0:any...):any... ", "SQLunionfunc;","" ] [ "sql", "update", "pattern sql.update(mvc:int, sname:str, tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)"] [ "sql", "update_schemas", "pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table"] [ "sql", "update_tables","pattern sql.update_tables():void ", "SYSupdate_tables;","Procedure triggered on update of the sys._tables table"] 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 @@ -19,6 +19,8 @@ #include "rel_optimizer.h" #include "sql_env.h" #include "sql_optimizer.h" +#include "sql_gencode.h" +#include "mal_builder.h" #define OUTER_ZERO 64 @@ -513,6 +515,10 @@ exp_bin(backend *be, sql_exp *e, stmt *l for(n=lst->op4.lval->h; n; n = n->next) list_append(l, const_column(
MonetDB: default - Query giving wrong result
Changeset: 2517fc0f6d86 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2517fc0f6d86 Modified Files: sql/test/subquery/Tests/subquery4.sql Branch: default Log Message: Query giving wrong result diffs (15 lines): diff --git a/sql/test/subquery/Tests/subquery4.sql b/sql/test/subquery/Tests/subquery4.sql --- a/sql/test/subquery/Tests/subquery4.sql +++ b/sql/test/subquery/Tests/subquery4.sql @@ -97,6 +97,11 @@ SELECT i FROM integers WHERE (SELECT COU -- 2 -- 3 +SELECT + (SELECT MAX(i2.i) FROM (SELECT MIN(i1.i)) AS i2(i)) +FROM integers i1; + -- 1 + UPDATE another_T SET col1 = MIN(col1); --error, aggregates not allowed in update set clause UPDATE another_T SET col2 = 1 WHERE col1 = SUM(col2); --error, aggregates not allowed in update set clause UPDATE another_T SET col3 = (SELECT MAX(col5)); --error, aggregates not allowed in update set clause ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Compilation fix
Changeset: 8ff7471cfe81 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8ff7471cfe81 Modified Files: sql/backends/monet5/rel_bin.c Branch: default Log Message: Compilation fix diffs (11 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 @@ -2542,6 +2542,7 @@ rel_rename(backend *be, sql_rel *rel, st { mvc *sql = be->mvc; + (void) sql; if (rel->exps) { node *en, *n; list *l = sa_list(be->mvc->sa); ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list