MonetDB: mtest - Convert some of the complex tests.

2020-11-23 Thread Sjoerd Mullender
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.

2020-11-23 Thread Sjoerd Mullender
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.

2020-11-23 Thread Sjoerd Mullender
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...

2020-11-23 Thread Sjoerd Mullender
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.

2020-11-23 Thread Sjoerd Mullender
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.

2020-11-23 Thread Sjoerd Mullender
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...

2020-11-23 Thread Sjoerd Mullender
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

2020-11-23 Thread Pedro Ferreira
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...

2020-11-23 Thread Pedro Ferreira
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 ...

2020-11-23 Thread Pedro Ferreira
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.

2020-11-23 Thread Aris Koning
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

2020-11-23 Thread Aris Koning
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.

2020-11-23 Thread Aris Koning
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.

2020-11-23 Thread Sjoerd Mullender
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

2020-11-23 Thread Pedro Ferreira
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

2020-11-23 Thread Pedro Ferreira
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...

2020-11-23 Thread Pedro Ferreira
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

2020-11-23 Thread Pedro Ferreira
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

2020-11-23 Thread Pedro Ferreira
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

2020-11-23 Thread svetlin
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

2020-11-23 Thread Pedro Ferreira
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

2020-11-23 Thread Pedro Ferreira
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

2020-11-23 Thread svetlin
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

2020-11-23 Thread Pedro Ferreira
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);
+