MonetDB: mtest - Convert some of the complex tests.
Changeset: 26aa31895953 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=26aa31895953 Added Files: sql/test/emptydb-upgrade-chain-hge/Tests/dump.SQL.py.src sql/test/emptydb-upgrade-chain/Tests/dump.SQL.py.src sql/test/emptydb-upgrade-hge/Tests/dump.SQL.py.src sql/test/emptydb-upgrade/Tests/dump.SQL.py.src sql/test/emptydb/Tests/dump.SQL.py sql/test/emptydb/Tests/load.test Modified Files: sql/test/emptydb-upgrade-chain-hge/Tests/dump.stable.out.int128 sql/test/emptydb-upgrade-chain/Tests/dump.stable.out sql/test/emptydb-upgrade-hge/Tests/dump.stable.out.int128 sql/test/emptydb-upgrade/Tests/dump.stable.out sql/test/emptydb/Tests/dump.stable.out Branch: mtest Log Message: Convert some of the complex tests. diffs (140 lines): diff --git a/sql/test/emptydb-upgrade-chain-hge/Tests/dump.SQL.py.src b/sql/test/emptydb-upgrade-chain-hge/Tests/dump.SQL.py.src new file mode 100644 --- /dev/null +++ b/sql/test/emptydb-upgrade-chain-hge/Tests/dump.SQL.py.src @@ -0,0 +1,1 @@ +$RELSRCDIR/../../emptydb/Tests/dump.SQL.py diff --git a/sql/test/emptydb-upgrade-chain-hge/Tests/dump.stable.out.int128 b/sql/test/emptydb-upgrade-chain-hge/Tests/dump.stable.out.int128 --- a/sql/test/emptydb-upgrade-chain-hge/Tests/dump.stable.out.int128 +++ b/sql/test/emptydb-upgrade-chain-hge/Tests/dump.stable.out.int128 @@ -28,10 +28,7 @@ stdout of test 'dump` in directory 'sql/ # 16:42:40 > "/usr/bin/python2" "dump.SQL.py" "dump" # 16:42:40 > -START TRANSACTION; -COMMIT; +# 17:29:11 > +# 17:29:11 > "Done." +# 17:29:11 > -# 16:42:41 > -# 16:42:41 > "Done." -# 16:42:41 > - diff --git a/sql/test/emptydb-upgrade-chain/Tests/dump.SQL.py.src b/sql/test/emptydb-upgrade-chain/Tests/dump.SQL.py.src new file mode 100644 --- /dev/null +++ b/sql/test/emptydb-upgrade-chain/Tests/dump.SQL.py.src @@ -0,0 +1,1 @@ +$RELSRCDIR/../../emptydb/Tests/dump.SQL.py diff --git a/sql/test/emptydb-upgrade-chain/Tests/dump.stable.out b/sql/test/emptydb-upgrade-chain/Tests/dump.stable.out --- a/sql/test/emptydb-upgrade-chain/Tests/dump.stable.out +++ b/sql/test/emptydb-upgrade-chain/Tests/dump.stable.out @@ -28,10 +28,7 @@ stdout of test 'dump` in directory 'sql/ # 16:42:35 > "/usr/bin/python2" "dump.SQL.py" "dump" # 16:42:35 > -START TRANSACTION; -COMMIT; +# 17:28:59 > +# 17:28:59 > "Done." +# 17:28:59 > -# 16:42:35 > -# 16:42:35 > "Done." -# 16:42:35 > - diff --git a/sql/test/emptydb-upgrade-hge/Tests/dump.SQL.py.src b/sql/test/emptydb-upgrade-hge/Tests/dump.SQL.py.src new file mode 100644 --- /dev/null +++ b/sql/test/emptydb-upgrade-hge/Tests/dump.SQL.py.src @@ -0,0 +1,1 @@ +$RELSRCDIR/../../emptydb/Tests/dump.SQL.py diff --git a/sql/test/emptydb-upgrade-hge/Tests/dump.stable.out.int128 b/sql/test/emptydb-upgrade-hge/Tests/dump.stable.out.int128 --- a/sql/test/emptydb-upgrade-hge/Tests/dump.stable.out.int128 +++ b/sql/test/emptydb-upgrade-hge/Tests/dump.stable.out.int128 @@ -28,10 +28,7 @@ stdout of test 'dump` in directory 'sql/ # 16:42:46 > "/usr/bin/python2" "dump.SQL.py" "dump" # 16:42:46 > -START TRANSACTION; -COMMIT; +# 17:29:23 > +# 17:29:23 > "Done." +# 17:29:23 > -# 16:42:46 > -# 16:42:46 > "Done." -# 16:42:46 > - diff --git a/sql/test/emptydb-upgrade/Tests/dump.SQL.py.src b/sql/test/emptydb-upgrade/Tests/dump.SQL.py.src new file mode 100644 --- /dev/null +++ b/sql/test/emptydb-upgrade/Tests/dump.SQL.py.src @@ -0,0 +1,1 @@ +$RELSRCDIR/../../emptydb/Tests/dump.SQL.py diff --git a/sql/test/emptydb-upgrade/Tests/dump.stable.out b/sql/test/emptydb-upgrade/Tests/dump.stable.out --- a/sql/test/emptydb-upgrade/Tests/dump.stable.out +++ b/sql/test/emptydb-upgrade/Tests/dump.stable.out @@ -28,10 +28,7 @@ stdout of test 'dump` in directory 'sql/ # 16:42:30 > "/usr/bin/python2" "dump.SQL.py" "dump" # 16:42:30 > -START TRANSACTION; -COMMIT; +# 17:28:49 > +# 17:28:49 > "Done." +# 17:28:49 > -# 16:42:30 > -# 16:42:30 > "Done." -# 16:42:30 > - diff --git a/sql/test/emptydb/Tests/dump.SQL.py b/sql/test/emptydb/Tests/dump.SQL.py new file mode 100644 --- /dev/null +++ b/sql/test/emptydb/Tests/dump.SQL.py @@ -0,0 +1,16 @@ +import os, sys, re +try: +from MonetDBtesting import process +except ImportError: +import process + +with process.client('sqldump', stdout=process.PIPE, stderr=process.PIPE) as c: +out, err = c.communicate() + +for line in out.split('\n'): +if line.startswith('--') or not line: +continue +if line != 'START TRANSACTION;' and line != 'COMMIT;': +# unexpected output, dump it all +print(out) +break diff --git a/sql/test/emptydb/Tests/dump.stable.out b/sql/test/emptydb/Tests/dump.stable.out --- a/sql/test/emptydb/Tests/dump.stable.out +++ b/sql/test/emptydb/Tests/dump.stable.out @@ -28,10 +28,7 @@ stdout of test 'dump` in directory 'sql/ # 14:10:23 > "/usr/bin/python2" "dump.SQL.py" "dump" # 14:10:23 > -START
MonetDB: default - Use table sys.privilege_codes.
Changeset: 7adf3853e5b7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7adf3853e5b7 Modified Files: clients/mapiclient/dump.c Branch: default Log Message: Use table sys.privilege_codes. diffs (60 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -2236,43 +2236,37 @@ dump_database(Mapi mid, stream *toConsol const char *column_grants = "SELECT s.name, t.name, " "c.name, a.name, " - "CASE p.privileges " - "WHEN 1 THEN 'SELECT' " - "WHEN 2 THEN 'UPDATE' " - "WHEN 4 THEN 'INSERT' " - "WHEN 8 THEN 'DELETE' " - "WHEN 16 THEN 'EXECUTE' " - "WHEN 32 THEN 'GRANT' " - "WHEN 64 THEN 'TRUNCATE' END, " + "pc.privilege_code_name, " "g.name, p.grantable " - "FROM sys.schemas s, sys.tables t, " -"sys.columns c, sys.auths a, " -"sys.privileges p, sys.auths g " + "FROM sys.schemas s, " +"sys.tables t, " +"sys.columns c, " +"sys.auths a, " +"sys.privileges p, " +"sys.auths g, " +"sys.privilege_codes pc " "WHERE p.obj_id = c.id " "AND c.table_id = t.id " "AND p.auth_id = a.id " "AND t.schema_id = s.id " "AND t.system = FALSE " "AND p.grantor = g.id " + "AND p.privileges = pc.privilege_code_id " "ORDER BY s.name, t.name, c.name, a.name, g.name, p.grantable"; const char *function_grants = "SELECT s.name, f.name, a.name, " - "CASE p.privileges " - "WHEN 1 THEN 'SELECT' " - "WHEN 2 THEN 'UPDATE' " - "WHEN 4 THEN 'INSERT' " - "WHEN 8 THEN 'DELETE' " - "WHEN 16 THEN 'EXECUTE' " - "WHEN 32 THEN 'GRANT' END, " + "pc.privilege_code_name, " "g.name, p.grantable, " "ft.function_type_keyword " "FROM sys.schemas s, sys.functions f, " "sys.auths a, sys.privileges p, sys.auths g, " -"sys.function_types ft " +"sys.function_types ft, " +"sys.privilege_codes pc " "WHERE s.id = f.schema_id " "AND f.id = p.obj_id " "AND p.auth_id = a.id " "AND p.grantor = g.id " + "AND p.privileges = pc.privilege_code_id " "AND f.type = ft.function_type_id " "AND NOT f.system " "ORDER BY s.name, f.name, a.name, g.name, p.grantable"; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Oct2020 - ALL PRIVILEGES includes the TRUNCATE privilege.
Changeset: d774581c291c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d774581c291c Modified Files: clients/mapiclient/dump.c Branch: Oct2020 Log Message: ALL PRIVILEGES includes the TRUNCATE privilege. diffs (12 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -3003,7 +3003,7 @@ dump_database(Mapi mid, stream *toConsol if (sname != NULL && strcmp(schema, sname) != 0) continue; mnstr_printf(toConsole, "GRANT"); - if (priv == 15) { + if (priv == 79) { mnstr_printf(toConsole, " ALL PRIVILEGES"); } else { const char *sep = ""; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Removed some ancient alternative code from mc...
Changeset: 7602b676e339 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7602b676e339 Modified Files: clients/mapiclient/dump.c clients/mapiclient/mclient.c clients/mapiclient/msqldump.h Branch: default Log Message: Removed some ancient alternative code from mclient/msqldump. By now we can assume that we have sys.comments, and that the sys.functions table has a column called "system". diffs (truncated from 567 to 300 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -46,76 +46,6 @@ #include "msqldump.h" -static const char * -get_with_comments_as_clause(Mapi mid) -{ - const char *query = /* check whether sys.comments exists */ - "SELECT t.id " - "FROM sys._tables t JOIN sys.schemas s ON t.schema_id = s.id " - "WHERE s.name = 'sys' AND t.name = 'comments'"; - const char *new_clause = - "WITH comments AS (SELECT * FROM sys.comments), " -"function_types AS (SELECT * FROM sys.function_types), " -"function_languages AS (SELECT * FROM sys.function_languages)"; - const char *old_clause = - "WITH comments AS (" - "SELECT 42 AS id, 'no comment' AS remark WHERE FALSE" -"), " -"function_types AS (" - "SELECT function_type_id, function_type_name, function_type_keyword " - "FROM sys.function_types, " -"(VALUES " - "(1, 'FUNCTION'), " - "(2, 'PROCEDURE'), " - "(3, 'AGGREGATE'), " - "(4, 'FILTER FUNCTION'), " - "(5, 'FUNCTION'), " - "(6, 'FUNCTION'), " - "(7, 'LOADER')) AS (id, function_type_keyword) " - "WHERE id = function_type_id" -"), " -"function_languages AS (" - "SELECT language_id, language_name, language_keyword " - "FROM sys.function_languages, (VALUES " - "(3, 'R'), " - "(4, 'C'), " - "(6, 'PYTHON'), " - "(7, 'PYTHON_MAP'), " - "(8, 'PYTHON2'), " - "(9, 'PYTHON2_MAP'), " - "(10, 'PYTHON3'), " - "(11, 'PYTHON3_MAP'), " - "(12, 'CPP')) AS (id, language_keyword) " - "WHERE id = language_id" -")"; - - bool has_sys_comments = false; - MapiHdl hdl = mapi_query(mid, query); - if (hdl) { - if (mapi_error(mid)) { - mapi_explain_result(hdl, stderr); - } else { - if (mapi_fetch_row(hdl)) - has_sys_comments = true; - } - mapi_close_handle(hdl); - } else - mapi_explain(mid, stderr); - - return has_sys_comments ? new_clause : old_clause; -} - -const char * -get_comments_clause(Mapi mid) -{ - static const char *comments_clause = NULL; - if (comments_clause == NULL) { - comments_clause = get_with_comments_as_clause(mid); - assert(comments_clause != NULL); - } - return comments_clause; -} - static int dquoted_print(stream *f, const char *s, const char *suff) { @@ -364,54 +294,6 @@ bailout: return 0; } -/* return TRUE if the sys.functions table has a column called system */ -static bool -has_funcsys(Mapi mid) -{ - MapiHdl hdl; - bool ret; - static int answer = -1; - - if (answer >= 0) - return answer; - - if ((hdl = mapi_query(mid, - "SELECT id " - "FROM sys._columns " - "WHERE name = 'system' " - "AND table_id = (" - " SELECT id" - " FROM sys._tables" - " WHERE name = 'functions'" - " AND schema_id = (" - " SELECT id" - " FROM sys.schemas" - " WHERE name = 'sys'))")) == NULL || - mapi_error(mid)) - goto bailout; - ret = mapi_get_row_count(hdl) == 1; - while ((mapi_fetch_row(hdl)) != 0) { - if (mapi_error(mid)) - goto bailout; - } - if (mapi_error(mid)) - goto bailout; - mapi_close_handle(hdl); - answer = ret; -
MonetDB: default - Merge with Oct2020 branch.
Changeset: 5c85f16abd60 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5c85f16abd60 Modified Files: monetdb5/modules/atoms/uuid.c sql/server/rel_exp.c sql/server/rel_psm.c sql/server/rel_select.c sql/test/miscellaneous/Tests/simple_selects.sql sql/test/miscellaneous/Tests/simple_selects.stable.out Branch: default Log Message: Merge with Oct2020 branch. diffs (truncated from 319 to 300 lines): diff --git a/monetdb5/modules/atoms/uuid.c b/monetdb5/modules/atoms/uuid.c --- a/monetdb5/modules/atoms/uuid.c +++ b/monetdb5/modules/atoms/uuid.c @@ -284,8 +284,9 @@ UUIDgenerateUuidInt_bulk(bat *ret, const bn->tnonil = true; bn->tnil = false; BATsetcount(bn, n); - bn->tsorted = n < 2; - bn->tkey = n < 2; + bn->tsorted = n <= 1; + bn->trevsorted = n <= 1; + bn->tkey = n <= 1; bailout: if (msg && bn) 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 @@ -228,6 +228,26 @@ exp_or(sql_allocator *sa, list *l, list return e; } +static int /* if the quantifier has to be upcasted, ignore the upper conversion for the cardinalilty */ +quantifier_has_rel(sql_exp *e) +{ + if (!e) + return 0; + switch(e->type){ + case e_convert: + return quantifier_has_rel(e->l); + case e_psm: + return exp_is_rel(e); + case e_atom: + case e_column: + case e_func: + case e_aggr: + case e_cmp: + return 0; + } + return 0; +} + sql_exp * exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype) { @@ -241,7 +261,7 @@ exp_in(sql_allocator *sa, sql_exp *l, li for (node *n = r->h; n ; n = n->next) { sql_exp *next = n->data; - if (!exp_is_rel(next) && exps_card < next->card) + if (!quantifier_has_rel(next) && exps_card < next->card) exps_card = next->card; } e->card = MAX(l->card, exps_card); @@ -276,10 +296,10 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e for (node *n = ((list*)vals->f)->h ; n ; n = n->next) { sql_exp *next = n->data; - if (!exp_is_rel(next) && exps_card < next->card) + if (!quantifier_has_rel(next) && exps_card < next->card) exps_card = next->card; } - } else if (!exp_is_rel(vals)) + } else if (!quantifier_has_rel(vals)) exps_card = vals->card; e->card = MAX(le->card, exps_card); @@ -300,7 +320,7 @@ exp_compare_func(mvc *sql, sql_exp *le, if (e) { e->flag = quantifier; /* At ANY and ALL operators, the cardinality on the right side is ignored if it is a sub-relation */ - e->card = quantifier && exp_is_rel(re) ? le->card : MAX(le->card, re->card); + e->card = quantifier && quantifier_has_rel(re) ? le->card : MAX(le->card, re->card); if (!has_nil(le) && !has_nil(re)) set_has_no_nil(e); } 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 @@ -622,6 +622,29 @@ rel_select_with_into(sql_query *query, s return rel_psm_block(query->sql->sa, reslist); } +static int while_exps_find_one_return(list *l); + +static int +while_exp_find_one_return(sql_exp *e) +{ + if (e->flag & PSM_RETURN) + return 1; + if (e->flag & PSM_WHILE) + return while_exps_find_one_return(e->r); + if (e->flag & PSM_IF) + return while_exps_find_one_return(e->r) || (e->f && while_exps_find_one_return(e->f)); + return 0; +} + +static int +while_exps_find_one_return(list *l) +{ + int res = 0; + for (node *n = l->h ; n && !res; n = n->next) + res |= while_exp_find_one_return(n->data); + return res; +} + static int has_return( list *l ); static int @@ -630,8 +653,10 @@ exp_has_return(sql_exp *e) if (e->type == e_psm) { if (e->flag & PSM_RETURN) return 1; - if (e->flag & PSM_IF) - return has_return(e->r) && (!e->f || has_return(e->f)); + if (e->flag & PSM_IF) /* for if, both sides must exist and both must have a return */ + return has_return(e->r) && e->f && has_return(e->f); + if (e->flag & PSM_WHILE) /* for while, at least one of the statements must have a return */ + return while_exps_find_one_return(e->r); } return 0; } @@ -640,10 +665,9 @@ static int has_return( list *l ) { node *n = l->t; - sql_exp *e = n->data; /* last
MonetDB: mtest - Change one error for another (better) one.
Changeset: 78f598eac7f8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=78f598eac7f8 Modified Files: sql/test/BugTracker-2008/Tests/year_overflow_bug.SF-2075133.test Branch: mtest Log Message: Change one error for another (better) one. diffs (13 lines): diff --git a/sql/test/BugTracker-2008/Tests/year_overflow_bug.SF-2075133.test b/sql/test/BugTracker-2008/Tests/year_overflow_bug.SF-2075133.test --- a/sql/test/BugTracker-2008/Tests/year_overflow_bug.SF-2075133.test +++ b/sql/test/BugTracker-2008/Tests/year_overflow_bug.SF-2075133.test @@ -4,7 +4,8 @@ CREATE TABLE A (a DATE) statement ok INSERT INTO A VALUES ( DATE '-01-01' + INTERVAL '1-00' YEAR TO MONTH) -statement error # This currently is a limitation of pymonetdb +query T nosort +-- This currently is a limitation of pymonetdb select * from A 1-01-01 ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: mtest - New function sys.describe_type to return SQL na...
Changeset: 02039d9709fb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=02039d9709fb Modified Files: sql/scripts/52_describe.sql Branch: mtest Log Message: New function sys.describe_type to return SQL name of type. This is now also used in the function sys.describe_columns. diffs (182 lines): diff --git a/sql/scripts/52_describe.sql b/sql/scripts/52_describe.sql --- a/sql/scripts/52_describe.sql +++ b/sql/scripts/52_describe.sql @@ -4,24 +4,158 @@ -- -- Copyright 1997 - July 2008 CWI, August 2008 - 2020 MonetDB B.V. +CREATE FUNCTION describe_type(ctype string, digits integer, tscale integer) + RETURNS string +BEGIN + RETURN +CASE ctype + WHEN 'bigint' THEN 'BIGINT' + WHEN 'blob' THEN + CASE digits + WHEN 0 THEN 'BINARY LARGE OBJECT' + ELSE 'BINARY LARGE OBJECT(' || CAST(digits AS string) || ')' + END + WHEN 'boolean' THEN 'BOOLEAN' + WHEN 'char' THEN +CASE digits + WHEN 1 THEN 'CHARACTER' + ELSE 'CHARACTER(' || CAST(digits AS string) || ')' +END + WHEN 'clob' THEN + CASE digits + WHEN 0 THEN 'CHARACTER LARGE OBJECT' + ELSE 'CHARACTER LARGE OBJECT(' || CAST(digits AS string) || ')' + END + WHEN 'date' THEN 'DATE' + WHEN 'day_interval' THEN 'INTERVAL DAY' + WHEN 'decimal' THEN 'DECIMAL(' || CAST(digits AS string) || ',' || CAST(tscale AS string) || ')' + WHEN 'double' THEN + CASE + WHEN digits = 53 and tscale = 0 THEN 'DOUBLE' + WHEN tscale = 0 THEN 'FLOAT(' || CAST(digits AS string) || ')' + ELSE 'FLOAT(' || CAST(digits AS string) || ',' || CAST(tscale AS string) || ')' + END + WHEN 'geometry' THEN + CASE digits + WHEN 4 THEN 'GEOMETRY(POINT' || +CASE tscale + WHEN 0 THEN '' + ELSE ',' || CAST(tscale AS string) +END || ')' + WHEN 8 THEN 'GEOMETRY(LINESTRING' || +CASE tscale + WHEN 0 THEN '' + ELSE ',' || CAST(tscale AS string) +END || ')' + WHEN 16 THEN 'GEOMETRY(POLYGON' || +CASE tscale + WHEN 0 THEN '' + ELSE ',' || CAST(tscale AS string) +END || ')' + WHEN 20 THEN 'GEOMETRY(MULTIPOINT' || +CASE tscale + WHEN 0 THEN '' + ELSE ',' || CAST(tscale AS string) +END || ')' + WHEN 24 THEN 'GEOMETRY(MULTILINESTRING' || +CASE tscale + WHEN 0 THEN '' + ELSE ',' || CAST(tscale AS string) +END || ')' + WHEN 28 THEN 'GEOMETRY(MULTIPOLYGON' || +CASE tscale + WHEN 0 THEN '' + ELSE ',' || CAST(tscale AS string) +END || ')' + WHEN 32 THEN 'GEOMETRY(GEOMETRYCOLLECTION' || +CASE tscale + WHEN 0 THEN '' + ELSE ',' || CAST(tscale AS string) +END || ')' + ELSE 'GEOMETRY' +END + WHEN 'hugeint' THEN 'HUGEINT' + WHEN 'int' THEN 'INTEGER' + WHEN 'month_interval' THEN + CASE digits + WHEN 1 THEN 'INTERVAL YEAR' + WHEN 2 THEN 'INTERVAL YEAR TO MONTH' + WHEN 3 THEN 'INTERVAL MONTH' + END + WHEN 'real' THEN + CASE + WHEN digits = 24 and tscale = 0 THEN 'REAL' + WHEN tscale = 0 THEN 'FLOAT(' || CAST(digits AS string) || ')' + ELSE 'FLOAT(' || CAST(digits AS string) || ',' || CAST(tscale AS string) || ')' + END + WHEN 'sec_interval' THEN + CASE digits + WHEN 4 THEN 'INTERVAL DAY' + WHEN 5 THEN 'INTERVAL DAY TO HOUR' + WHEN 6 THEN 'INTERVAL DAY TO MINUTE' + WHEN 7 THEN 'INTERVAL DAY TO SECOND' + WHEN 8 THEN 'INTERVAL HOUR' + WHEN 9 THEN 'INTERVAL HOUR TO MINUTE' + WHEN 10 THEN 'INTERVAL HOUR TO SECOND' + WHEN 11 THEN 'INTERVAL MINUTE' + WHEN 12 THEN 'INTERVAL MINUTE TO SECOND' + WHEN 13 THEN 'INTERVAL SECOND' + END + WHEN 'smallint' THEN 'SMALLINT' + WHEN 'time' THEN + CASE digits + WHEN 1 THEN 'TIME' + ELSE 'TIME(' || CAST(digits - 1 AS string) || ')' + END + WHEN 'timestamp' THEN + CASE digits + WHEN 7 THEN 'TIMESTAMP' + ELSE 'TIMESTAMP(' || CAST(digits - 1 AS string) || ')' + END + WHEN 'timestamptz' THEN + CASE digits + WHEN 7 THEN 'TIMESTAMP' + ELSE 'TIMESTAMP(' || CAST(digits - 1 AS string) || ')' + END || ' WITH TIME ZONE' + WHEN 'timetz' THEN + CASE digits + WHEN 1 THEN 'TIME' + ELSE 'TIME(' || CAST(digits - 1 AS string) || ')' + END || ' WITH TIME ZONE' + WHEN 'tinyint' THEN 'TINYINT' + WHEN 'varchar' THEN 'CHARACTER VARYING(' || CAST(digits AS string) || ')' + ELSE +CASE + WHEN lower(ctype) = ctype THEN upper(ctype) + ELSE '"'
MonetDB: Oct2020 - Don't forget comparisons
Changeset: 5133ac32a583 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5133ac32a583 Modified Files: sql/server/rel_select.c Branch: Oct2020 Log Message: Don't forget comparisons diffs (16 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 @@ -5088,6 +5088,12 @@ exp_has_rank(sql_exp *e) /* fall through */ case e_aggr: return exps_has_rank(e->l); + case e_cmp: + if (e->flag == cmp_or || e->flag == cmp_filter) + return exps_has_rank(e->l) || exps_has_rank(e->r); + if (e->flag == cmp_in || e->flag == cmp_notin) + return exp_has_rank(e->l) || exps_has_rank(e->r); + return exp_has_rank(e->l) || exp_has_rank(e->r) || (e->f && exp_has_rank(e->f)); default: return 0; } ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Oct2020 - Improved return statements detection at the e...
Changeset: df40fa37b7a2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=df40fa37b7a2 Modified Files: sql/server/rel_psm.c sql/test/Dependencies/dependency_functions.sql sql/test/miscellaneous/Tests/simple_selects.sql sql/test/miscellaneous/Tests/simple_selects.stable.err sql/test/miscellaneous/Tests/simple_selects.stable.out Branch: Oct2020 Log Message: Improved return statements detection at the end of a SQL function diffs (152 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 @@ -622,6 +622,29 @@ rel_select_with_into(sql_query *query, s return rel_psm_block(query->sql->sa, reslist); } +static int while_exps_find_one_return(list *l); + +static int +while_exp_find_one_return(sql_exp *e) +{ + if (e->flag & PSM_RETURN) + return 1; + if (e->flag & PSM_WHILE) + return while_exps_find_one_return(e->r); + if (e->flag & PSM_IF) + return while_exps_find_one_return(e->r) || (e->f && while_exps_find_one_return(e->f)); + return 0; +} + +static int +while_exps_find_one_return(list *l) +{ + int res = 0; + for (node *n = l->h ; n && !res; n = n->next) + res |= while_exp_find_one_return(n->data); + return res; +} + static int has_return( list *l ); static int @@ -630,8 +653,10 @@ exp_has_return(sql_exp *e) if (e->type == e_psm) { if (e->flag & PSM_RETURN) return 1; - if (e->flag & PSM_IF) - return has_return(e->r) && (!e->f || has_return(e->f)); + if (e->flag & PSM_IF) /* for if, both sides must exist and both must have a return */ + return has_return(e->r) && e->f && has_return(e->f); + if (e->flag & PSM_WHILE) /* for while, at least one of the statements must have a return */ + return while_exps_find_one_return(e->r); } return 0; } @@ -640,10 +665,9 @@ static int has_return( list *l ) { node *n = l->t; - sql_exp *e = n->data; /* last statment of sequential block */ - if (exp_has_return(e)) + if (n && exp_has_return(n->data)) return 1; return 0; } diff --git a/sql/test/Dependencies/dependency_functions.sql b/sql/test/Dependencies/dependency_functions.sql --- a/sql/test/Dependencies/dependency_functions.sql +++ b/sql/test/Dependencies/dependency_functions.sql @@ -22,6 +22,8 @@ BEGIN IF f1() < 0 THEN RETURN 2; + ELSE + RETURN 3; END IF; END; @@ -31,6 +33,8 @@ RETURNS int BEGIN IF f1() < 0 THEN RETURN 1; + ELSE + RETURN 2; END IF; END; 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 @@ -231,9 +231,18 @@ select 1, null intersect select 1, null; start transaction; create or replace function ups() returns int begin if null > 1 then return 1; else return 2; end if; end; select ups(); + -- 2 +create or replace function ups() returns int begin while 1 = 1 do if null is null then return 1; else return 2; end if; end while; end; +select ups(); + -- 1 +create or replace function ups() returns int begin declare a int; set a = 2; while a < 2 do if null is null then return 3; else set a = 2; end if; end while; end; +select ups(); + -- 3 create or replace function ups() returns int begin if 1 > 1 then return 1; end if; end; --error, return missing rollback; +create or replace function ups() returns int begin declare a int; while 1 = 1 do set a = 2; end while; end; --error, return missing + start transaction; create function ""() returns int return 1; select ""(); 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 @@ -274,6 +274,14 @@ MAPI = (monetdb) /var/tmp/mtest-921778/ QUERY = select x as z, y as z from (select 1, 2) as x(x,y) order by z; ERROR = !SELECT: identifier 'z' ambiguous CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-331513/.s.monetdb.32675 +QUERY = create or replace function ups() returns int begin if 1 > 1 then return 1; end if; end; --error, return missing +ERROR = !CREATE FUNCTION: missing return statement +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-408341/.s.monetdb.34589 +QUERY = create or replace function ups() returns int begin declare a int; while 1 = 1 do set a = 2; end while; end; --error, return missing +ERROR = !CREATE FUNCTION: missing return statement +CODE = 42000 # 17:31:38 > # 17:31:38 > "Done."
MonetDB: Oct2020 - For every comparison the inputs must be from ...
Changeset: 6a7174945181 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6a7174945181 Modified Files: sql/server/rel_exp.c sql/server/rel_select.c sql/test/miscellaneous/Tests/simple_selects.sql Branch: Oct2020 Log Message: For every comparison the inputs must be from the same type. When determining the cardinality of a comparison with a quantifier, ignore conversions above it. This fixes one of the bugs I found today diffs (152 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 @@ -228,6 +228,26 @@ exp_or(sql_allocator *sa, list *l, list return e; } +static int /* if the quantifier has to be upcasted, ignore the upper conversion for the cardinalilty */ +quantifier_has_rel(sql_exp *e) +{ + if (!e) + return 0; + switch(e->type){ + case e_convert: + return quantifier_has_rel(e->l); + case e_psm: + return exp_is_rel(e); + case e_atom: + case e_column: + case e_func: + case e_aggr: + case e_cmp: + return 0; + } + return 0; +} + sql_exp * exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype) { @@ -241,7 +261,7 @@ exp_in(sql_allocator *sa, sql_exp *l, li for (node *n = r->h; n ; n = n->next) { sql_exp *next = n->data; - if (!exp_is_rel(next) && exps_card < next->card) + if (!quantifier_has_rel(next) && exps_card < next->card) exps_card = next->card; } e->card = MAX(l->card, exps_card); @@ -276,10 +296,10 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e for (node *n = ((list*)vals->f)->h ; n ; n = n->next) { sql_exp *next = n->data; - if (!exp_is_rel(next) && exps_card < next->card) + if (!quantifier_has_rel(next) && exps_card < next->card) exps_card = next->card; } - } else if (!exp_is_rel(vals)) + } else if (!quantifier_has_rel(vals)) exps_card = vals->card; e->card = MAX(le->card, exps_card); @@ -300,7 +320,7 @@ exp_compare_func(mvc *sql, sql_exp *le, if (e) { e->flag = quantifier; /* At ANY and ALL operators, the cardinality on the right side is ignored if it is a sub-relation */ - e->card = quantifier && exp_is_rel(re) ? le->card : MAX(le->card, re->card); + e->card = quantifier && quantifier_has_rel(re) ? le->card : MAX(le->card, re->card); if (!has_nil(le) && !has_nil(re)) set_has_no_nil(e); } 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 @@ -1550,7 +1550,7 @@ static sql_rel * rel_compare_exp_(sql_query *query, sql_rel *rel, sql_exp *ls, sql_exp *rs, sql_exp *rs2, int type, int anti, int quantifier, int f) { mvc *sql = query->sql; - sql_exp *L = ls, *R = rs, *e = NULL; + sql_exp *e = NULL; if (quantifier || exp_is_rel(ls) || exp_is_rel(rs)) { if (rs2) { @@ -1558,7 +1558,7 @@ rel_compare_exp_(sql_query *query, sql_r if (anti) set_anti(e); } else { - if (rel_binop_check_types(sql, rel, ls, rs, 0) < 0) + if (rel_convert_types(sql, rel, rel, , , 1, type_equal_no_any) < 0) return NULL; e = exp_compare_func(sql, ls, rs, compare_func((comp_type)type, quantifier?0:anti), quantifier); if (anti && quantifier) @@ -1569,22 +1569,18 @@ rel_compare_exp_(sql_query *query, sql_r } else if (!rs2) { if (ls->card < rs->card) { sql_exp *swap = ls; - ls = rs; rs = swap; - - swap = L; - L = R; - R = swap; - type = (int)swap_compare((comp_type)type); } if (rel_convert_types(sql, rel, rel, , , 1, type_equal_no_any) < 0) return NULL; e = exp_compare(sql->sa, ls, rs, type); } else { - if ((rs = exp_check_type(sql, exp_subtype(ls), rel, rs, type_equal)) == NULL || - (rs2 && (rs2 = exp_check_type(sql, exp_subtype(ls), rel, rs2, type_equal)) == NULL)) + assert(rs2); + if (rel_convert_types(sql, rel, rel, , , 1, type_equal_no_any) < 0) + return NULL; + if (!(rs2 = exp_check_type(sql, exp_subtype(ls), rel, rs2, type_equal)))
MonetDB: default - Merge with monetdbe-proxy.
Changeset: ed0392ec7dc3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ed0392ec7dc3 Branch: default Log Message: Merge with monetdbe-proxy. diffs (20 lines): diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -644,6 +644,7 @@ static bool urls_matches(const char* l, static int monetdbe_open_remote(monetdbe_database_internal *mdbe, char *url, monetdbe_options *opts) { + assert(opts); monetdbe_remote* remote = opts->remote; if (!remote) { @@ -724,7 +725,7 @@ monetdbe_open(monetdbe_database *dbhdl, mdbe->msg = NULL; mdbe->c = NULL; - bool is_remote = opts->remote != NULL; + bool is_remote = (opts && (opts->remote != NULL)); if (!monetdbe_embedded_initialized) { /* When used as a remote mapi proxy, * it is still necessary to have an initialized monetdbe. E.g. for BAT life cycle management. ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: monetdbe-proxy - Check for opts == NUll
Changeset: ca6f78d2813f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ca6f78d2813f Modified Files: tools/monetdbe/monetdbe.c Branch: monetdbe-proxy Log Message: Check for opts == NUll diffs (20 lines): diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -644,6 +644,7 @@ static bool urls_matches(const char* l, static int monetdbe_open_remote(monetdbe_database_internal *mdbe, char *url, monetdbe_options *opts) { + assert(opts); monetdbe_remote* remote = opts->remote; if (!remote) { @@ -724,7 +725,7 @@ monetdbe_open(monetdbe_database *dbhdl, mdbe->msg = NULL; mdbe->c = NULL; - bool is_remote = opts->remote != NULL; + bool is_remote = (opts && (opts->remote != NULL)); if (!monetdbe_embedded_initialized) { /* When used as a remote mapi proxy, * it is still necessary to have an initialized monetdbe. E.g. for BAT life cycle management. ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: monetdbe-proxy - Merge with default.
Changeset: ce4fd4692804 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ce4fd4692804 Removed Files: clients/odbc/driver/ODBC.syms clients/odbc/winsetup/setup.syms monetdb5/modules/atoms/mtime.h monetdb5/modules/atoms/mtime_analytic.c sql/test/miscellaneous/Tests/simple_plans.stable.out.single Branch: monetdbe-proxy Log Message: Merge with default. diffs (truncated from 151181 to 300 lines): diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -789,3 +789,5 @@ cb4b3f021774b60ffd84c3004d341ec04de736f3 bd91504a03736565fb2dff13cd4c94c738e81aa0 Oct2020_5 cb4b3f021774b60ffd84c3004d341ec04de736f3 Oct2020_release bd91504a03736565fb2dff13cd4c94c738e81aa0 Oct2020_release +ac8254a47e87d0be9df2a623e2c2fcf67c0f982d Oct2020_7 +ac8254a47e87d0be9df2a623e2c2fcf67c0f982d Oct2020_SP1_release diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -183,4 +183,5 @@ if(CMAKE_SUMMARY) monetdb_cmake_summary() endif() + # vim: set ts=2:sw=2:et diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -97,7 +97,7 @@ Group: Applications/Databases License: MPLv2.0 URL: https://www.monetdb.org/ BugURL: https://bugs.monetdb.org/ -Source: https://www.monetdb.org/downloads/sources/Oct2020/%{name}-%{version}.tar.bz2 +Source: https://www.monetdb.org/downloads/sources/Oct2020-SP1/%{name}-%{version}.tar.bz2 # The Fedora packaging document says we need systemd-rpm-macros for # the _unitdir and _tmpfilesdir macros to exist; however on RHEL 7 @@ -153,6 +153,13 @@ BuildRequires: python3-numpy %endif %if %{with rintegration} BuildRequires: pkgconfig(libR) +%if (0%{?fedora} == 32) +# work around a packaging bug on Fedora 32 (18 Nov 2020) +# problem is things like: +# file /etc/texlive/web2c/updmap.cfg conflicts between attempted installs of texlive-tetex-7:20190410-12.fc32.noarch and texlive-texlive-scripts-7:20200327-16.fc32.noarch +# texlive-tetex is obsoleted by texlive-obsolete +BuildRequires: texlive-obsolete +%endif %endif # if we were to compile with cmocka support (-DWITH_CMOCKA=ON): # BuildRequires: pkgconfig(cmocka) @@ -861,11 +868,36 @@ else fi %endif +%if %{?rhel:0}%{!?rhel:1} || 0%{?rhel} >= 7 +# fix up some paths (/var/run -> /run) +# needed because CMAKE_INSTALL_RUNSTATEDIR refers to /var/run +sed -i 's|/var/run|/run|' \ +%{buildroot}%{_tmpfilesdir}/monetdbd.conf \ +%{buildroot}%{_localstatedir}/monetdb5/dbfarm/.merovingian_properties \ +%{buildroot}%{_unitdir}/monetdbd.service +%endif + %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %changelog +* Wed Nov 18 2020 Sjoerd Mullender - 11.39.7-20201118 +- Rebuilt. +- BZ#6890: Add support of xz/lzma (de)compression on MS Windows +- BZ#6891: Add support of lz4 (de)compression on MS Windows +- BZ#6971: Parsing table returning function on remote server fails +- BZ#6981: Oct2020: PREPARE DDL statement silently fails +- BZ#6983: monetdb allows to use non-existing optimizer pipe +- BZ#6998: MAL profiler buffer limitations +- BZ#7001: crossproduct generated for a simple (semi-)join +- BZ#7003: Segfault on large chain of constant decimal multiplication +- BZ#7005: Dropping a STREAM TABLE does not remove the associated column + info from sys._columns +- BZ#7010: deallocate results in all prepared statements being + deallocated (not error-related) +- BZ#7011: uuid() called only once when used in projection list + * Tue Oct 13 2020 Sjoerd Mullender - 11.39.5-20201013 - Rebuilt. 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 @@ -6064,6 +6064,8 @@ stdout of test 'MAL-signatures` in direc [ "batmmath", "radians", "pattern batmmath.radians(X_1:bat[:dbl], X_2:bat[:oid]):bat[:dbl] ","CMDscience_bat_radians;", "" ] [ "batmmath", "radians", "pattern batmmath.radians(X_1:bat[:flt]):bat[:flt] ", "CMDscience_bat_radians;", "" ] [ "batmmath", "radians", "pattern batmmath.radians(X_1:bat[:flt], X_2:bat[:oid]):bat[:flt] ","CMDscience_bat_radians;", "" ] +[ "batmmath", "rand", "unsafe pattern batmmath.rand(X_1:bat[:int]):bat[:int] ", "CMDscience_bat_randintarg;", "" ] +[ "batmmath", "rand", "unsafe pattern batmmath.rand(X_1:bat[:int], X_2:bat[:oid]):bat[:int] ","CMDscience_bat_randintarg;", "" ] [ "batmmath", "sin", "pattern batmmath.sin(X_1:bat[:dbl]):bat[:dbl] ", "CMDscience_bat_sin;", "" ] [ "batmmath", "sin", "pattern batmmath.sin(X_1:bat[:dbl], X_2:bat[:oid]):bat[:dbl] ","CMDscience_bat_sin;", "" ] [ "batmmath", "sin", "pattern batmmath.sin(X_1:bat[:flt]):bat[:flt] ", "CMDscience_bat_sin;", "" ] @@ -6294,78 +6296,78 @@ stdout of test 'MAL-signatures` in direc [ "batsql","any", "pattern batsql.any(X_1:bit, X_2:bat[:bit],
MonetDB: Oct2020 - Set revsorted property properly.
Changeset: 37c1d2bb51c4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=37c1d2bb51c4 Modified Files: monetdb5/modules/atoms/uuid.c Branch: Oct2020 Log Message: Set revsorted property properly. diffs (15 lines): diff --git a/monetdb5/modules/atoms/uuid.c b/monetdb5/modules/atoms/uuid.c --- a/monetdb5/modules/atoms/uuid.c +++ b/monetdb5/modules/atoms/uuid.c @@ -269,8 +269,9 @@ UUIDgenerateUuidInt_bulk(bat *ret, const bn->tnonil = true; bn->tnil = false; BATsetcount(bn, n); - bn->tsorted = n < 2; - bn->tkey = n < 2; + bn->tsorted = n <= 1; + bn->trevsorted = n <= 1; + bn->tkey = n <= 1; bailout: if (b) ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: scoping2 - Merged with default
Changeset: 8bff027202e2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8bff027202e2 Modified Files: sql/server/rel_select.c Branch: scoping2 Log Message: Merged with default diffs (258 lines): diff --git a/monetdb5/optimizer/opt_pushselect.c b/monetdb5/optimizer/opt_pushselect.c --- a/monetdb5/optimizer/opt_pushselect.c +++ b/monetdb5/optimizer/opt_pushselect.c @@ -22,6 +22,7 @@ PushArgument(MalBlkPtr mb, InstrPtr p, i return p; } +#if 0 static InstrPtr PushNil(MalBlkPtr mb, InstrPtr p, int pos, int tpe) { @@ -34,6 +35,7 @@ PushNil(MalBlkPtr mb, InstrPtr p, int po getArg(p, pos) = arg; return p; } +#endif static InstrPtr ReplaceWithNil(MalBlkPtr mb, InstrPtr p, int pos, int tpe) @@ -74,6 +76,7 @@ subselect_add( subselect_t *subselects, return i; } +#if 0 static int subselect_find_tids( subselect_t *subselects, int subselect) { @@ -99,6 +102,7 @@ subselect_find_subselect( subselect_t *s } return -1; } +#endif static int lastbat_arg(MalBlkPtr mb, InstrPtr p) @@ -298,7 +302,7 @@ OPTpushselectImplementation(Client cntxt } } - if (/* DISABLES CODE */ (0) && subselects.nr) { + if (nr_likes || subselects.nr) { if (newMalBlkStmt(mb, mb->ssize) <0 ) { GDKfree(vars); goto wrapup; @@ -309,12 +313,16 @@ OPTpushselectImplementation(Client cntxt for (i = 1; i < limit; i++) { p = old[i]; - /* rewrite batalgebra.like + select -> likeselect */ - if (getModuleId(p) == algebraRef && p->retc == 1 && getFunctionId(p) == selectRef) { + /* rewrite batalgebra.like + [theta]select -> likeselect */ + if (getModuleId(p) == algebraRef && p->retc == 1 && + (getFunctionId(p) == selectRef || getFunctionId(p) == thetaselectRef)) { int var = getArg(p, 1); InstrPtr q = mb->stmt[vars[var]]; /* BEWARE: the optimizer may not add or remove statements ! */ - if (isLikeOp(q)) { /* TODO check if getArg(p, 3) value == TRUE */ + if (isLikeOp(q) && + !isaBatType(getArgType(mb, q, 2)) && /* pattern is a value */ + (q->argc != 4 || !isaBatType(getArgType(mb, q, 3))) /* escape is a value */ + ) { InstrPtr r = newInstruction(mb, algebraRef, likeselectRef); int has_cand = (getArgType(mb, p, 2) == newBatType(TYPE_oid)); int a, anti = (getFunctionId(q)[0] == 'n'), ignore_case = (getFunctionId(q)[anti?4:0] == 'i'); @@ -340,6 +348,7 @@ OPTpushselectImplementation(Client cntxt /* inject table ids into subselect * s = subselect(c, C1..) => subselect(c, t, C1..) */ +#if 0 if (isSelect(p) && p->retc == 1) { int tid = 0; @@ -445,6 +454,7 @@ OPTpushselectImplementation(Client cntxt } } } +#endif pushInstruction(mb,p); } for (; isa); exp_kind ek = {type_value, card_value, TRUE}; - unsigned int card = dlist_length(rowlist) == 1 ? CARD_ATOM : CARD_MULTI; for (dnode *o = rowlist->h; o; o = o->next) { dlist *values = o->data.lval; @@ -823,7 +822,9 @@ rel_values(sql_query *query, symbol *tab } } } + /* loop to check types and cardinality */ + unsigned int card = exps->h && list_length(((sql_exp*)exps->h->data)->f) > 1 ? CARD_MULTI : CARD_ATOM; for (m = exps->h; m; m = m->next) { sql_exp *e = m->data; diff --git a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out --- a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out +++ b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out @@ -263,12 +263,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); +C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); +C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, false:bit); (X_19:bat[:oid], X_20:bat[:str]) :=
MonetDB: scoping2 - English
Changeset: 99ee0fe5d6fe for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=99ee0fe5d6fe Modified Files: sql/server/sql_mvc.h Branch: scoping2 Log Message: English diffs (12 lines): 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 @@ -122,7 +122,7 @@ typedef struct mvc { struct symbol *sym; int8_t use_views:1, - schema_path_has_sys:1, /* speed up objcect lookup */ + schema_path_has_sys:1, /* speed up object search */ schema_path_has_tmp:1; struct qc *qc; int clientid; /* id of the owner */ ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: scoping2 - Don't iterate twice and don't forget to rese...
Changeset: ad87c372bc5f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ad87c372bc5f Modified Files: sql/backends/monet5/sql_user.c Branch: scoping2 Log Message: Don't iterate twice and don't forget to reset cache variables when building the schema path list diffs (32 lines): diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c --- a/sql/backends/monet5/sql_user.c +++ b/sql/backends/monet5/sql_user.c @@ -62,20 +62,24 @@ monet5_drop_user(ptr _mvc, str user) #define default_schema_path "\"sys\"" /* "sys" will be the default schema path */ static str -parse_schema_path_str(mvc *m, str schema_path, bool build) +parse_schema_path_str(mvc *m, str schema_path, bool build) /* this function for both building and validating the schema path */ { list *l = m->schema_path; char next_schema[1024]; /* needs one extra character for null terminator */ - size_t len = strlen(schema_path), status = outside_str, bp = 0; + int status = outside_str; + size_t bp = 0; if (strNil(schema_path)) throw(SQL, "sql.schema_path", SQLSTATE(42000) "A schema path cannot be NULL"); - if (build) + if (build) { while (l->t) /* if building, empty schema_path list */ (void) list_remove_node(l, l->t); + m->schema_path_has_sys = 0; + m->schema_path_has_tmp = 0; + } - for (size_t i = 0 ; i < len; i++) { + for (size_t i = 0; schema_path[i]; i++) { char next = schema_path[i]; if (next == '"') { ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: scoping2 - I don't expect to find a view here
Changeset: 5b20655228b3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5b20655228b3 Modified Files: sql/server/rel_schema.c Branch: scoping2 Log Message: I don't expect to find a view here diffs (30 lines): 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 @@ -331,7 +331,7 @@ column_constraint_type(mvc *sql, const c sql_kc *kc; assert(n->next->next->next->type == type_int); - rt = find_table_or_view_on_scope(sql, ss, rsname, rtname, "CONSTRAINT FOREIGN KEY", isView(t)); + rt = find_table_or_view_on_scope(sql, ss, rsname, rtname, "CONSTRAINT FOREIGN KEY", false); /* self referenced table */ if (!rt && t->s == ss && strcmp(t->base.name, rtname) == 0) { sql->errstr[0] = '\0'; /* reset table not found error */ @@ -487,7 +487,7 @@ table_foreign_key(mvc *sql, char *name, char *rtname = qname_schema_object(n->data.lval); sql_table *ft = NULL; - ft = find_table_or_view_on_scope(sql, ss, rsname, rtname, "CONSTRAINT FOREIGN KEY", isView(t)); + ft = find_table_or_view_on_scope(sql, ss, rsname, rtname, "CONSTRAINT FOREIGN KEY", false); /* self referenced table */ if (!ft && t->s == ss && strcmp(t->base.name, rtname) == 0) { sql->errstr[0] = '\0'; /* reset table not found error */ @@ -819,7 +819,7 @@ table_element(sql_query *query, symbol * char *name = qname_schema_object(s->data.lval); sql_table *ot = NULL; - if (!(ot = find_table_or_view_on_scope(sql, ss, sname, name, action, isView(t + if (!(ot = find_table_or_view_on_scope(sql, ss, sname, name, action, false))) return SQL_ERR; for (node *n = ot->columns.set->h; n; n = n->next) { sql_column *oc = n->data; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: mtest - Converted explain and recently fixed bug tests
Changeset: b0660a06dac4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b0660a06dac4 Added Files: sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.test Modified Files: sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.test Branch: mtest Log Message: Converted explain and recently fixed bug tests diffs (260 lines): diff --git a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.test b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.test --- a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.test +++ b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.test @@ -4,25 +4,101 @@ set optimizer='sequential_pipe' statement ok start transaction -query T rowsort +query T python .explain.function_histogram explain select name,func from functions where name like '%optimizers%' -49 values hashing to d713c0c3af0828e8fea5d727bab227d1 +user.main +2 +querylog.define +1 +bat.pack +5 +sql.mvc +1 +sql.bind +6 +sql.tid +1 +algebra.likeselect +3 +sql.subdelta +1 +sql.projectdelta +2 +sql.resultSet +1 -query T rowsort +query T python .explain.function_histogram explain select name,func from functions where name not like '%optimizers%' -49 values hashing to b2c935a91fc22ef6a2f353e3d1ea3b5d +user.main +2 +querylog.define +1 +bat.pack +5 +sql.mvc +1 +sql.bind +6 +sql.tid +1 +algebra.likeselect +3 +sql.subdelta +1 +sql.projectdelta +2 +sql.resultSet +1 -query T rowsort +query T python .explain.function_histogram explain select name,func from functions where name ilike '%optimizers%' -49 values hashing to 0e429e45d28d24ed3ded17df94b9d0ae +user.main +2 +querylog.define +1 +bat.pack +5 +sql.mvc +1 +sql.bind +6 +sql.tid +1 +algebra.ilikeselect +3 +sql.subdelta +1 +sql.projectdelta +2 +sql.resultSet +1 -query T rowsort +query T python .explain.function_histogram explain select name,func from functions where name not ilike '%optimizers%' -49 values hashing to 135bf4644cf0bf17ee26c24b633860b6 +user.main +2 +querylog.define +1 +bat.pack +5 +sql.mvc +1 +sql.bind +6 +sql.tid +1 +algebra.ilikeselect +3 +sql.subdelta +1 +sql.projectdelta +2 +sql.resultSet +1 statement ok create function contains(str string, substr string) @@ -52,25 +128,101 @@ begin return str not ilike '%'||substr||'%'; end -query T rowsort +query T python .explain.function_histogram explain select name,func from functions where contains(name, 'optimizers') -48 values hashing to fabc9441a4652a3a1c9106c7e0c3fa1b +user.main +2 +querylog.define +1 +bat.pack +5 +sql.mvc +1 +sql.bind +6 +sql.tid +1 +algebra.likeselect +3 +sql.subdelta +1 +sql.projectdelta +2 +sql.resultSet +1 -query T rowsort +query T python .explain.function_histogram explain select name,func from functions where not_contains(name, 'optimizers') -48 values hashing to 522a2218258c852bbf35544c697c7bd6 +user.main +2 +querylog.define +1 +bat.pack +5 +sql.mvc +1 +sql.bind +6 +sql.tid +1 +algebra.likeselect +3 +sql.subdelta +1 +sql.projectdelta +2 +sql.resultSet +1 -query T rowsort +query T python .explain.function_histogram explain select name,func from functions where icontains(name, 'optimizers') -48 values hashing to ec801ff82084d51f74d37b043498f705 +user.main +2 +querylog.define +1 +bat.pack +5 +sql.mvc +1 +sql.bind +6 +sql.tid +1 +algebra.likeselect +3 +sql.subdelta +1 +sql.projectdelta +2 +sql.resultSet +1 -query T rowsort +query T python .explain.function_histogram explain select name,func from functions where not_icontains(name, 'optimizers') -48 values hashing to 493330f083173a86623617b4e6527ce3 +user.main +2 +querylog.define +1 +bat.pack +5 +sql.mvc +1 +sql.bind +6 +sql.tid +1 +algebra.likeselect +3 +sql.subdelta +1 +sql.projectdelta +2 +sql.resultSet +1 statement ok rollback diff --git a/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.test b/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.test new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2020/Tests/values-groupby.Bug-7013.test @@ -0,0 +1,32 @@ +statement ok +START TRANSACTION + +statement ok +CREATE VIEW v AS SELECT a1, a2 FROM (VALUES (1,2)) as (a1,a2) GROUP BY a1, a2 + +query I rowsort +SELECT a1 from v + +1 + +query I rowsort +SELECT a2 from v + +2 + +query II rowsort +SELECT a1, a2 from v + +1 +2 + +query II rowsort +SELECT * from v + +1 +2 + +statement ok +ROLLBACK + + ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: mtest - print skip tests when verbose selected
Changeset: 05a4867530fd for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=05a4867530fd Modified Files: testing/Mz.py.in Branch: mtest Log Message: print skip tests when verbose selected diffs (17 lines): diff --git a/testing/Mz.py.in b/testing/Mz.py.in --- a/testing/Mz.py.in +++ b/testing/Mz.py.in @@ -2845,9 +2845,10 @@ def main(argv) : print() print('failed={}, skipped={}'.format(failed, skipped)) print('Ran {} test in {:7.3f}'.format(test_count - skipped, t_)) -for TSTDIR, TST, reason in SKIPPED_TESTS: -prpurple('SKIP\t') -print('{} {} {}'.format(TSTDIR, TST, reason)) +if verbose: +for TSTDIR, TST, reason in SKIPPED_TESTS: +prpurple('SKIP\t') +print('{} {} {}'.format(TSTDIR, TST, reason)) finally: # cleanup the place where we put our UNIX sockets ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: mtest - Merged with default
Changeset: 8fe50f4c6fd0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8fe50f4c6fd0 Modified Files: sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out sql/test/BugTracker-2020/Tests/All Branch: mtest Log Message: Merged with default diffs (258 lines): diff --git a/monetdb5/optimizer/opt_pushselect.c b/monetdb5/optimizer/opt_pushselect.c --- a/monetdb5/optimizer/opt_pushselect.c +++ b/monetdb5/optimizer/opt_pushselect.c @@ -22,6 +22,7 @@ PushArgument(MalBlkPtr mb, InstrPtr p, i return p; } +#if 0 static InstrPtr PushNil(MalBlkPtr mb, InstrPtr p, int pos, int tpe) { @@ -34,6 +35,7 @@ PushNil(MalBlkPtr mb, InstrPtr p, int po getArg(p, pos) = arg; return p; } +#endif static InstrPtr ReplaceWithNil(MalBlkPtr mb, InstrPtr p, int pos, int tpe) @@ -74,6 +76,7 @@ subselect_add( subselect_t *subselects, return i; } +#if 0 static int subselect_find_tids( subselect_t *subselects, int subselect) { @@ -99,6 +102,7 @@ subselect_find_subselect( subselect_t *s } return -1; } +#endif static int lastbat_arg(MalBlkPtr mb, InstrPtr p) @@ -298,7 +302,7 @@ OPTpushselectImplementation(Client cntxt } } - if (/* DISABLES CODE */ (0) && subselects.nr) { + if (nr_likes || subselects.nr) { if (newMalBlkStmt(mb, mb->ssize) <0 ) { GDKfree(vars); goto wrapup; @@ -309,12 +313,16 @@ OPTpushselectImplementation(Client cntxt for (i = 1; i < limit; i++) { p = old[i]; - /* rewrite batalgebra.like + select -> likeselect */ - if (getModuleId(p) == algebraRef && p->retc == 1 && getFunctionId(p) == selectRef) { + /* rewrite batalgebra.like + [theta]select -> likeselect */ + if (getModuleId(p) == algebraRef && p->retc == 1 && + (getFunctionId(p) == selectRef || getFunctionId(p) == thetaselectRef)) { int var = getArg(p, 1); InstrPtr q = mb->stmt[vars[var]]; /* BEWARE: the optimizer may not add or remove statements ! */ - if (isLikeOp(q)) { /* TODO check if getArg(p, 3) value == TRUE */ + if (isLikeOp(q) && + !isaBatType(getArgType(mb, q, 2)) && /* pattern is a value */ + (q->argc != 4 || !isaBatType(getArgType(mb, q, 3))) /* escape is a value */ + ) { InstrPtr r = newInstruction(mb, algebraRef, likeselectRef); int has_cand = (getArgType(mb, p, 2) == newBatType(TYPE_oid)); int a, anti = (getFunctionId(q)[0] == 'n'), ignore_case = (getFunctionId(q)[anti?4:0] == 'i'); @@ -340,6 +348,7 @@ OPTpushselectImplementation(Client cntxt /* inject table ids into subselect * s = subselect(c, C1..) => subselect(c, t, C1..) */ +#if 0 if (isSelect(p) && p->retc == 1) { int tid = 0; @@ -445,6 +454,7 @@ OPTpushselectImplementation(Client cntxt } } } +#endif pushInstruction(mb,p); } for (; isa); exp_kind ek = {type_value, card_value, TRUE}; - unsigned int card = dlist_length(rowlist) == 1 ? CARD_ATOM : CARD_MULTI; for (dnode *o = rowlist->h; o; o = o->next) { dlist *values = o->data.lval; @@ -803,7 +802,9 @@ rel_values(sql_query *query, symbol *tab } } } + /* loop to check types and cardinality */ + unsigned int card = exps->h && list_length(((sql_exp*)exps->h->data)->f) > 1 ? CARD_MULTI : CARD_ATOM; for (m = exps->h; m; m = m->next) { sql_exp *e = m->data; diff --git a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out --- a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out +++ b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out @@ -263,12 +263,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); +C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); +C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid],
MonetDB: default - Merged with Oct2020
Changeset: a13e520c099b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a13e520c099b Modified Files: sql/server/rel_select.c sql/test/BugTracker-2020/Tests/All Branch: default Log Message: Merged with Oct2020 diffs (258 lines): diff --git a/monetdb5/optimizer/opt_pushselect.c b/monetdb5/optimizer/opt_pushselect.c --- a/monetdb5/optimizer/opt_pushselect.c +++ b/monetdb5/optimizer/opt_pushselect.c @@ -22,6 +22,7 @@ PushArgument(MalBlkPtr mb, InstrPtr p, i return p; } +#if 0 static InstrPtr PushNil(MalBlkPtr mb, InstrPtr p, int pos, int tpe) { @@ -34,6 +35,7 @@ PushNil(MalBlkPtr mb, InstrPtr p, int po getArg(p, pos) = arg; return p; } +#endif static InstrPtr ReplaceWithNil(MalBlkPtr mb, InstrPtr p, int pos, int tpe) @@ -74,6 +76,7 @@ subselect_add( subselect_t *subselects, return i; } +#if 0 static int subselect_find_tids( subselect_t *subselects, int subselect) { @@ -99,6 +102,7 @@ subselect_find_subselect( subselect_t *s } return -1; } +#endif static int lastbat_arg(MalBlkPtr mb, InstrPtr p) @@ -298,7 +302,7 @@ OPTpushselectImplementation(Client cntxt } } - if (/* DISABLES CODE */ (0) && subselects.nr) { + if (nr_likes || subselects.nr) { if (newMalBlkStmt(mb, mb->ssize) <0 ) { GDKfree(vars); goto wrapup; @@ -309,12 +313,16 @@ OPTpushselectImplementation(Client cntxt for (i = 1; i < limit; i++) { p = old[i]; - /* rewrite batalgebra.like + select -> likeselect */ - if (getModuleId(p) == algebraRef && p->retc == 1 && getFunctionId(p) == selectRef) { + /* rewrite batalgebra.like + [theta]select -> likeselect */ + if (getModuleId(p) == algebraRef && p->retc == 1 && + (getFunctionId(p) == selectRef || getFunctionId(p) == thetaselectRef)) { int var = getArg(p, 1); InstrPtr q = mb->stmt[vars[var]]; /* BEWARE: the optimizer may not add or remove statements ! */ - if (isLikeOp(q)) { /* TODO check if getArg(p, 3) value == TRUE */ + if (isLikeOp(q) && + !isaBatType(getArgType(mb, q, 2)) && /* pattern is a value */ + (q->argc != 4 || !isaBatType(getArgType(mb, q, 3))) /* escape is a value */ + ) { InstrPtr r = newInstruction(mb, algebraRef, likeselectRef); int has_cand = (getArgType(mb, p, 2) == newBatType(TYPE_oid)); int a, anti = (getFunctionId(q)[0] == 'n'), ignore_case = (getFunctionId(q)[anti?4:0] == 'i'); @@ -340,6 +348,7 @@ OPTpushselectImplementation(Client cntxt /* inject table ids into subselect * s = subselect(c, C1..) => subselect(c, t, C1..) */ +#if 0 if (isSelect(p) && p->retc == 1) { int tid = 0; @@ -445,6 +454,7 @@ OPTpushselectImplementation(Client cntxt } } } +#endif pushInstruction(mb,p); } for (; isa); exp_kind ek = {type_value, card_value, TRUE}; - unsigned int card = dlist_length(rowlist) == 1 ? CARD_ATOM : CARD_MULTI; for (dnode *o = rowlist->h; o; o = o->next) { dlist *values = o->data.lval; @@ -803,7 +802,9 @@ rel_values(sql_query *query, symbol *tab } } } + /* loop to check types and cardinality */ + unsigned int card = exps->h && list_length(((sql_exp*)exps->h->data)->f) > 1 ? CARD_MULTI : CARD_ATOM; for (m = exps->h; m; m = m->next) { sql_exp *e = m->data; diff --git a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out --- a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out +++ b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out @@ -263,12 +263,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); +C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); +C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, false:bit);
MonetDB: mtest - describe_function sql
Changeset: dea53750a16f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dea53750a16f Added Files: sql/test/Users/Tests/changePasswordUser.reqtests Modified Files: sql/scripts/52_describe.sql sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.test Branch: mtest Log Message: describe_function sql diffs (53 lines): diff --git a/sql/scripts/52_describe.sql b/sql/scripts/52_describe.sql --- a/sql/scripts/52_describe.sql +++ b/sql/scripts/52_describe.sql @@ -28,3 +28,16 @@ BEGIN AND s.name = schemaName ORDER BY c.number; END; + +create function describe_function(schemaName string, functionName string) + returns table(id integer, name string, type string, language string, remark string) +BEGIN +return SELECT f.id, f.name, ft.function_type_keyword, fl.language_keyword, c.remark +FROM sys.functions f +JOIN sys.schemas s ON f.schema_id = s.id +JOIN sys.function_types ft ON f.type = ft.function_type_id +LEFT OUTER JOIN sys.function_languages fl ON f.language = fl.language_id +LEFT OUTER JOIN sys.comments c ON f.id = c.id +WHERE f.name=functionName AND s.name = schemaName; +END; + diff --git a/sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.test b/sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.test --- a/sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.test +++ b/sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.test @@ -14,9 +14,9 @@ query rowsort select "name", "query", "type", "remark" from describe_table('sys', 'x') --- TODO FIX ME statement ok -\df test +select "name", "type", "language", "remark" from describe_function('sys', 'test') + statement ok drop procedure test @@ -34,9 +34,9 @@ query rowsort select "name", "query", "type", "remark" from describe_table('sys', 'x') --- TODO FIX ME statement ok -\df test +select "name", "type", "language", "remark" from describe_function('sys', 'test') + statement ok drop procedure test diff --git a/sql/test/Users/Tests/changePasswordUser.reqtests b/sql/test/Users/Tests/changePasswordUser.reqtests new file mode 100644 --- /dev/null +++ b/sql/test/Users/Tests/changePasswordUser.reqtests @@ -0,0 +1,1 @@ +createSetUp ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Oct2020 - Approved output
Changeset: f6042c7b011d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f6042c7b011d Modified Files: sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out Branch: Oct2020 Log Message: Approved output diffs (75 lines): diff --git a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out --- a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out +++ b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out @@ -263,12 +263,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); +C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); +C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, false:bit); (X_19:bat[:oid], X_20:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 2:int); +C_132:bat[:oid] := algebra.likeselect(X_20:bat[:str], nil:bat[:oid], "%optimizers%":str, "":str, false:bit, false:bit); X_18:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 1:int); -X_21:bat[:str] := sql.delta(X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); -X_91:bat[:bit] := batalgebra.like(X_21:bat[:str], "%optimizers%":str); -C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); -C_35:bat[:oid] := algebra.thetaselect(X_91:bat[:bit], C_5:bat[:oid], true:bit, "==":str); +C_134:bat[:oid] := algebra.likeselect(X_18:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, false:bit); +C_35:bat[:oid] := sql.subdelta(C_131:bat[:oid], C_5:bat[:oid], X_19:bat[:oid], C_132:bat[:oid], C_134:bat[:oid]); X_37:bat[:str] := sql.projectdelta(C_35:bat[:oid], X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); X_22:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 0:int); (X_25:bat[:oid], X_26:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 2:int); @@ -315,12 +316,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); +C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); +C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, true:bit); (X_19:bat[:oid], X_20:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 2:int); +C_132:bat[:oid] := algebra.likeselect(X_20:bat[:str], nil:bat[:oid], "%optimizers%":str, "":str, false:bit, true:bit); X_18:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 1:int); -X_21:bat[:str] := sql.delta(X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); -X_91:bat[:bit] := batalgebra.not_like(X_21:bat[:str], "%optimizers%":str); -C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); -C_35:bat[:oid] := algebra.thetaselect(X_91:bat[:bit], C_5:bat[:oid], true:bit, "==":str); +C_134:bat[:oid] := algebra.likeselect(X_18:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, false:bit, true:bit); +C_35:bat[:oid] := sql.subdelta(C_131:bat[:oid], C_5:bat[:oid], X_19:bat[:oid], C_132:bat[:oid], C_134:bat[:oid]); X_37:bat[:str] := sql.projectdelta(C_35:bat[:oid], X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); X_22:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 0:int); (X_25:bat[:oid], X_26:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "func":str, 2:int); @@ -367,12 +369,13 @@ function user.main():void; X_44:bat[:int] := bat.pack(0:int, 0:int); X_4:int := sql.mvc(); X_17:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 0:int); +C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); +C_131:bat[:oid] := algebra.likeselect(X_17:bat[:str], C_5:bat[:oid], "%optimizers%":str, "":str, true:bit, false:bit); (X_19:bat[:oid], X_20:bat[:str]) := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 2:int); +C_132:bat[:oid] := algebra.likeselect(X_20:bat[:str], nil:bat[:oid], "%optimizers%":str, "":str, true:bit, false:bit); X_18:bat[:str] := sql.bind(X_4:int, "sys":str, "functions":str, "name":str, 1:int); -X_21:bat[:str] := sql.delta(X_17:bat[:str], X_19:bat[:oid], X_20:bat[:str], X_18:bat[:str]); -X_91:bat[:bit] := batalgebra.ilike(X_21:bat[:str], "%optimizers%":str); -C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "functions":str); -C_35:bat[:oid] := algebra.thetaselect(X_91:bat[:bit], C_5:bat[:oid], true:bit, "==":str); +