MonetDB: newjson - lookup json subtype correctly

2025-01-28 Thread Niels Nes via checkin-list
Changeset: f7f744805fc2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f7f744805fc2
Modified Files:
sql/backends/monet5/vaults/json/json.c
Branch: newjson
Log Message:

lookup json subtype correctly


diffs (13 lines):

diff --git a/sql/backends/monet5/vaults/json/json.c 
b/sql/backends/monet5/vaults/json/json.c
--- a/sql/backends/monet5/vaults/json/json.c
+++ b/sql/backends/monet5/vaults/json/json.c
@@ -160,8 +160,7 @@ json_relation(mvc *sql, sql_subfunc *f, 
// use file name as columnn name ?
char *cname = sa_strdup(sql->sa, "json");
list_append(names, cname);
-   sql_subtype *tpe = sql_bind_localtype("str");
-   tpe->type->base.name = "json";
+   sql_subtype *tpe = sql_bind_subtype(sql->sa, "json", 0, 0);
list_append(types, tpe);
sql_exp *ne = exp_column(sql->sa, a_create(sql->sa, tname), cname, tpe, 
CARD_MULTI, 1, 0, 0);
set_basecol(ne);
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: nested - approved output

2025-01-28 Thread Niels Nes via checkin-list
Changeset: 8e75b50c48c1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8e75b50c48c1
Modified Files:
sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.test
sql/test/sys-schema/Tests/check_Not_Nullable_columns.test
Branch: nested
Log Message:

approved output


diffs (142 lines):

diff --git 
a/sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.test 
b/sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.test
--- a/sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.test
+++ b/sql/test/sys-schema/Tests/check_ForeignKey_referential_integrity.test
@@ -30,27 +30,27 @@ query ITIT rowsort
 SELECT * FROM tmp._tables WHERE type NOT IN (SELECT table_type_id FROM 
sys.table_types)
 
 
-query ITTIIITIITI rowsort
+query ITTIIITIITII rowsort
 SELECT * FROM sys.columns WHERE table_id NOT IN (SELECT id FROM sys.tables)
 
 
-query ITTIIITIITI rowsort
+query ITTIIITIITII rowsort
 SELECT * FROM sys._columns WHERE table_id NOT IN (SELECT id FROM sys._tables)
 
 
-query ITTIIITIITI rowsort
+query ITTIIITIITII rowsort
 SELECT * FROM tmp._columns WHERE table_id NOT IN (SELECT id FROM tmp._tables)
 
 
-query ITTIIITIITI rowsort
+query ITTIIITIITII rowsort
 SELECT * FROM sys.columns WHERE type NOT IN (SELECT sqlname FROM sys.types)
 
 
-query ITTIIITIITI rowsort
+query ITTIIITIITII rowsort
 SELECT * FROM sys._columns WHERE type NOT IN (SELECT sqlname FROM sys.types)
 
 
-query ITTIIITIITI rowsort
+query ITTIIITIITII rowsort
 SELECT * FROM tmp._columns WHERE type NOT IN (SELECT sqlname FROM sys.types)
 
 
@@ -70,11 +70,11 @@ query ITTTI rowsort
 SELECT * FROM sys.functions WHERE system AND schema_id NOT IN (SELECT id FROM 
sys.schemas WHERE system)
 
 
-query IITT rowsort
+query IITTI rowsort
 SELECT * FROM sys.args WHERE func_id NOT IN (SELECT id FROM sys.functions)
 
 
-query IITT rowsort
+query IITTI rowsort
 SELECT * FROM sys.args WHERE type NOT IN (SELECT sqlname FROM sys.types)
 
 
diff --git a/sql/test/sys-schema/Tests/check_Not_Nullable_columns.test 
b/sql/test/sys-schema/Tests/check_Not_Nullable_columns.test
--- a/sql/test/sys-schema/Tests/check_Not_Nullable_columns.test
+++ b/sql/test/sys-schema/Tests/check_Not_Nullable_columns.test
@@ -110,35 +110,35 @@ query TIT rowsort
 SELECT "table_type_name", * FROM "sys"."table_types" WHERE "table_type_name" 
IS NULL OR "table_type_name" = ''
 
 
-query IITTIIITIITI rowsort
+query IITTIIITIITII rowsort
 SELECT "id", * FROM "sys"."_columns" WHERE "id" IS NULL
 
 
-query TITTIIITIITI rowsort
+query TITTIIITIITII rowsort
 SELECT "name", * FROM "sys"."_columns" WHERE "name" IS NULL OR "name" = ''
 
 
-query TITTIIITIITI rowsort
+query TITTIIITIITII rowsort
 SELECT "type", * FROM "sys"."_columns" WHERE "type" IS NULL OR "type" = ''
 
 
-query IITTIIITIITI rowsort
+query IITTIIITIITII rowsort
 SELECT "type_digits", * FROM "sys"."_columns" WHERE "type_digits" IS NULL
 
 
-query IITTIIITIITI rowsort
+query IITTIIITIITII rowsort
 SELECT "type_scale", * FROM "sys"."_columns" WHERE "type_scale" IS NULL
 
 
-query IITTIIITIITI rowsort
+query IITTIIITIITII rowsort
 SELECT "table_id", * FROM "sys"."_columns" WHERE "table_id" IS NULL
 
 
-query IITTIIITIITI rowsort
+query IITTIIITIITII rowsort
 SELECT "null", * FROM "sys"."_columns" WHERE "null" IS NULL
 
 
-query IITTIIITIITI rowsort
+query IITTIIITIITII rowsort
 SELECT "number", * FROM "sys"."_columns" WHERE "number" IS NULL
 
 
@@ -170,35 +170,35 @@ query IITIT rowsort
 SELECT "access", * FROM "sys"."_tables" WHERE "access" IS NULL
 
 
-query IIITT rowsort
+query IIITTI rowsort
 SELECT "id", * FROM "sys"."args" WHERE "id" IS NULL
 
 
-query IIITT rowsort
+query IIITTI rowsort
 SELECT "func_id", * FROM "sys"."args" WHERE "func_id" IS NULL
 
 
-query TIITT rowsort
+query TIITTI rowsort
 SELECT "name", * FROM "sys"."args" WHERE "name" IS NULL OR "name" = ''
 
 
-query TIITT rowsort
+query TIITTI rowsort
 SELECT "type", * FROM "sys"."args" WHERE "type" IS NULL OR "type" = ''
 
 
-query IIITT rowsort
+query IIITTI rowsort
 SELECT "type_digits", * FROM "sys"."args" WHERE "type_digits" IS NULL
 
 
-query IIITT rowsort
+query IIITTI rowsort
 SELECT "type_scale", * FROM "sys"."args" WHERE "type_scale" IS NULL
 
 
-query IIITT rowsort
+query IIITTI rowsort
 SELECT "inout", * FROM "sys"."args" WHERE "inout" IS NULL
 
 
-query IIITT rowsort
+query IIITTI rowsort
 SELECT "number", * FROM "sys"."args" WHERE "number" IS NULL
 
 
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: nested - approved output

2025-01-28 Thread Niels Nes via checkin-list
Changeset: 16e83a891ec0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/16e83a891ec0
Modified Files:
sql/test/nested/Tests/simple.test
Branch: nested
Log Message:

approved output


diffs (154 lines):

diff --git a/sql/test/nested/Tests/simple.test 
b/sql/test/nested/Tests/simple.test
--- a/sql/test/nested/Tests/simple.test
+++ b/sql/test/nested/Tests/simple.test
@@ -7,7 +7,7 @@ create table foo(p pair)
 statement ok
 insert into foo values (('left', 'right')), (('left', 'right'))
 
-query TT
+query TT nosort
 select p.key, p.value from foo
 
 left
@@ -15,7 +15,7 @@ right
 left
 right
 
-query I
+query I nosort
 select count(*) from foo
 
 2
@@ -26,7 +26,7 @@ create table bar(p pair[])
 statement ok
 insert into bar values (array[('left', 'right'), ('left', 'right')])
 
-query TT
+query TT nosort
 select p.key, p.value from bar, unnest(p)
 
 left
@@ -34,7 +34,7 @@ right
 left
 right
 
-query I
+query I nosort
 select count(*) from bar, unnest(p)
 
 2
@@ -45,7 +45,7 @@ create table tpv( i integer, p pair)
 statement ok
 insert into tpv values (1, ('left','right')), (2, ('left','right')), (3, 
('l1', 'r1'))
 
-query ITT
+query ITT nosort
 select i, p.key, p.value from tpv
 
 1
@@ -64,64 +64,86 @@ create table tpsv( i integer, p pair[2])
 statement ok
 insert into tpsv values (1, array [ ('left','right'), ('l2','r2') ]), (2, 
array [ ('left','right'), ('l2','r2') ]), (3, array [ ('l3', 'r3') ])
 
-
-query ITT
+query ITT nosort
 select i, p.key, p.value from tpsv cross join unnest(p)
 
+1
+left
+right
+1
+left
+right
+2
+l2
+r2
+2
+l2
+r2
+3
+left
+right
 
-query ITT
+query ITT nosort
 select i, up.key, up.value from tpsv cross join unnest(p) up where i = 1
 
+1
+left
+right
+1
+l2
+r2
 
-query ITT
+query ITT nosort
 select i, up.key, up.value from tpsv cross join unnest(p) up where up.key = 
'left'
 
+1
+left
+right
+2
+left
+right
 
-query II
+query II nosort
 select i, count(*) from tpsv cross join unnest(p) up group by i
 
-
+1
+2
+2
+2
+3
+1
 
 statement ok
 insert into tpsv select i, p from tpsv
 
-
-query ITTII
+query I nosort
 select cast(json '[ { "pleft": "left", "pright": "right" }]' as pair[])
 
 
-
-query ITTII
+query I nosort
 select cast(json '[ { "pleft": "left", "pright": "right" }, { "pleft": "l1", 
"pright": "r1" }]' as pair[])
 
 
-
 statement ok
 insert into tpsv select 1, cast(json '[ { "pleft": "left", "pright": "right" 
}, { "pleft": "l1", "pright": "r1" }]' as pair[])
 
-
 statement ok
 create type npair as (ppair pair[], i integer)
 
-
 statement ok
 create table np (id integer, np npair[])
 
-
 statement ok
 insert into np values (1, array [ (array [ ('left','right'), ('l2','r2') ], 
11), (array [], 12) ]), (2, array [ ( array [ ('l3', 'r3') ], 22) ])
 
-
 statement ok
 create type ipair AS (pleft varchar, pright integer)
 
-
-query TTIII
+query TTIII nosort
 select  cast(json '[ { "pleft": "left", "pright": "1" }]' as ipair[])
 
 
-
-query ITIII
+query ITIII nosort
 select  cast(json '[ { "pleft": "left", "pright": "1" }, { "pleft": "l1", 
"pright": "2" }]' as ipair[])
 
 
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: nested - removed debug print

2025-01-28 Thread Niels Nes via checkin-list
Changeset: 9310b631d8f8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9310b631d8f8
Modified Files:
sql/backends/monet5/sql.c
Branch: nested
Log Message:

removed debug print


diffs (11 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -1045,7 +1045,6 @@ mvc_renumber_bulk(Client cntxt, MalBlkPt
/* if oi is dense, use offset based renumbers */
if (!bo->tsorted || !BATtkey(bo) || (bcnt && (oi[0] + (int)(bcnt-1)) != 
oi[bcnt-1]) ) {
BAT *lo = NULL;
-   printf("not dense %d\n", oi[0]);
if (BATleftjoin(&lo, NULL, bo, i, NULL, NULL, false, cnt) != 
GDK_SUCCEED) {
BBPreclaim(i);
BBPreclaim(bo);
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: nested - approved output

2025-01-28 Thread Niels Nes via checkin-list
Changeset: 90fd751a1f1f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/90fd751a1f1f
Modified Files:
sql/test/nested/Tests/simple.test
Branch: nested
Log Message:

approved output


diffs (27 lines):

diff --git a/sql/test/nested/Tests/simple.test 
b/sql/test/nested/Tests/simple.test
--- a/sql/test/nested/Tests/simple.test
+++ b/sql/test/nested/Tests/simple.test
@@ -139,11 +139,22 @@ insert into np values (1, array [ (array
 statement ok
 create type ipair AS (pleft varchar, pright integer)
 
-query TTIII nosort
+query ITIII nosort
 select  cast(json '[ { "pleft": "left", "pright": "1" }]' as ipair[])
 
+1
+"left"
+2240802
+1
+1
 
 query ITIII nosort
 select  cast(json '[ { "pleft": "left", "pright": "1" }, { "pleft": "l1", 
"pright": "2" }]' as ipair[])
 
+1
+"left"
+2240802
+1
+1
 
+
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: nested - initial support for reading array values from ...

2025-01-28 Thread Niels Nes via checkin-list
Changeset: c357add77275 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c357add77275
Modified Files:
clients/Tests/MAL-signatures-hge.test
clients/Tests/MAL-signatures.test
clients/Tests/exports.stable.out
sql/backends/monet5/sql.c
sql/backends/monet5/sql_statement.c
sql/server/rel_exp.c
sql/server/rel_multiset.c

sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.test
sql/test/BugTracker-2014/Tests/crash_on_or_with_in.Bug-3461.test
sql/test/BugTracker-2014/Tests/in_incorrect_multi.Bug-3462.test
sql/test/BugTracker-2019/Tests/alter_table_set_schema.Bug-6701.test
sql/test/BugTracker-2020/Tests/drop-stream-table.Bug-7005.test
Branch: nested
Log Message:

initial support for reading array values from strings

approved some test outputs


diffs (truncated from 331 to 300 lines):

diff --git a/clients/Tests/MAL-signatures-hge.test 
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -49147,7 +49147,12 @@ sql
 from_json
 pattern sql.from_json(X_0:json, X_1:ptr):bat[:any]...
 SQLfrom_json
-Reads json string into table of nested structures
+Reads json string into table of nested/multiset structures
+sql
+from_varchar
+pattern sql.from_varchar(X_0:str, X_1:ptr):bat[:any]...
+SQLfrom_varchar
+Reads string into table of nested/multiset structures
 sql
 getVariable
 pattern sql.getVariable(X_0:int, X_1:str, X_2:str):any_1
diff --git a/clients/Tests/MAL-signatures.test 
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -37602,7 +37602,12 @@ sql
 from_json
 pattern sql.from_json(X_0:json, X_1:ptr):bat[:any]...
 SQLfrom_json
-Reads json string into table of nested structures
+Reads json string into table of nested/multiset structures
+sql
+from_varchar
+pattern sql.from_varchar(X_0:str, X_1:ptr):bat[:any]...
+SQLfrom_varchar
+Reads string into table of nested/multiset structures
 sql
 getVariable
 pattern sql.getVariable(X_0:int, X_1:str, X_2:str):any_1
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -791,6 +791,8 @@ str COPYrejects(Client cntxt, MalBlkPtr 
 str COPYrejects_clear(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str GRPgroup1(bat *ngid, bat *next, bat *nhis, const bat *bid);
 str GRPsubgroup5(bat *ngid, bat *next, bat *nhis, const bat *bid, const bat 
*sid, const bat *gid, const bat *eid, const bat *hid);
+void JSONfree(JSON *jt);
+JSON *JSONparse(const char *j);
 int MAL_MAXCLIENTS;
 int MALcommentsOnly(MalBlkPtr mb);
 lng MALdebug;
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -5866,6 +5866,53 @@ bailout:
throw(SQL, "SQLfrom_json", SQLSTATE(HY013) MAL_MALLOC_FAIL);
 }
 
+static str
+SQLfrom_varchar(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+   (void)cntxt;
+   str msg = NULL;
+   int mtype = getArgType(mb, pci, pci->retc);
+
+   if (mtype != TYPE_str)
+   throw(SQL, "SQLfrom_varchar", SQLSTATE(HY013) "Incorrect 
argument type");
+   str s = *(str*)getArgReference(stk, pci, pci->retc);
+   sql_subtype *t = *(sql_subtype**)getArgReference(stk, pci, pci->retc+1);
+
+   BAT **bats = (BAT**)GDKzalloc(sizeof(BAT*) * pci->retc);
+   if (!bats)
+   throw(SQL, "SQLfrom_varchar", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+   for(int i = 0; i < pci->retc; i++) {
+   bats[i] = COLnew(0, getBatType(getArgType(mb, pci, i)), 10, 
TRANSIENT);
+   if (!bats[i])
+   goto bailout;
+   }
+
+   JSON *js = JSONparse(s);
+   if (!js) /* TODO output parser error ?? */
+   goto bailout;
+
+   if (t->multiset)
+   (void)insert_json_array(&msg, js, bats, pci->retc, 0, 1, 1, t);
+   else
+   (void)insert_json_object(&msg, js, bats, pci->retc, 0, 1, 1, t);
+   JSONfree(js);
+   if (msg)
+   goto bailout;
+   for(int i = 0; i < pci->retc && bats[i]; i++) {
+   *getArgReference_bat(stk, pci, i) = bats[i]->batCacheid;
+   BBPkeepref(bats[i]);
+   }
+   GDKfree(bats);
+   return MAL_SUCCEED;
+bailout:
+   for(int i = 0; i < pci->retc && bats[i]; i++)
+   BBPreclaim(bats[i]);
+   GDKfree(bats);
+   if (msg)
+   throw(SQL, "SQLfrom_varchar", SQLSTATE(42000) "%s", msg);
+   throw(SQL, "SQLfrom_varchar", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+}
+
 static mel_func sql_init_funcs[] = {
  pattern("sql", "shutdown", SQLshutdown_wrap, true, "", args(1,3, 
arg("",str),arg("delay",bte),arg("force",bit))),
  pattern("sql", "shutdown", SQLshutdown_wrap, true, "", args(1,3, 
arg("",str),arg("delay",sh

MonetDB: nested - approved output

2025-01-28 Thread Niels Nes via checkin-list
Changeset: 8e868bf4f556 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8e868bf4f556
Modified Files:
sql/test/Dependencies/Tests/dependency_owner_schema_3.test
sql/test/bugs/Tests/innerjoin_multiple-bug-sf-943661.test
Branch: nested
Log Message:

approved output


diffs (31 lines):

diff --git a/sql/test/Dependencies/Tests/dependency_owner_schema_3.test 
b/sql/test/Dependencies/Tests/dependency_owner_schema_3.test
--- a/sql/test/Dependencies/Tests/dependency_owner_schema_3.test
+++ b/sql/test/Dependencies/Tests/dependency_owner_schema_3.test
@@ -886,7 +886,7 @@ DEP_FUNC
 query TTT nosort
 SELECT distinct c.name, v.name, 'DEP_VIEW' from sys.columns as c, sys.tables 
as v, sys.dependencies as dep where c.id = dep.id AND v.id = dep.depend_id AND 
dep.depend_type = 5 AND v.type in (1, 11, 21, 31) order by c.name, v.name
 
-1788 values hashing to a7640c35ae84fb0995f708b8b88e01d0
+1794 values hashing to 0dae1e3a7c956b3f6a9f62ce67a737e0
 
 query TTT nosort
 SELECT c.name, k.name, 'DEP_KEY' from sys.columns as c,  sys.objects as kc, 
sys.keys as k where kc."name" = c.name AND kc.id = k.id AND k.table_id = 
c.table_id AND k.rkey = -1 order by c.name, k.name
diff --git a/sql/test/bugs/Tests/innerjoin_multiple-bug-sf-943661.test 
b/sql/test/bugs/Tests/innerjoin_multiple-bug-sf-943661.test
--- a/sql/test/bugs/Tests/innerjoin_multiple-bug-sf-943661.test
+++ b/sql/test/bugs/Tests/innerjoin_multiple-bug-sf-943661.test
@@ -11,7 +11,7 @@ select schemas.name, tables.name, column
'objects', 'keys', 'modules', 'sequences')
  order by schemas.name, tables.name, columns.name
 
-438 values hashing to 2bd7ef18b01fbee6f139b64003828536
+441 values hashing to 9fb8b451a549eed8d9b5168ded796bd4
 
 query TTT nosort
 select s.name, t.name, c.name from
@@ -26,5 +26,5 @@ select s.name, t.name, c.name from
'objects', 'keys', 'modules', 'sequences')
  order by s.name, t.name, c.name
 
-438 values hashing to 2bd7ef18b01fbee6f139b64003828536
+441 values hashing to 9fb8b451a549eed8d9b5168ded796bd4
 
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: nested - merged with default

2025-01-28 Thread Niels Nes via checkin-list
Changeset: cf841883f7c8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cf841883f7c8
Modified Files:
sql/server/rel_rewriter.h
Branch: nested
Log Message:

merged with default


diffs (truncated from 507 to 300 lines):

diff --git a/sql/server/rel_optimize_exps.c b/sql/server/rel_optimize_exps.c
--- a/sql/server/rel_optimize_exps.c
+++ b/sql/server/rel_optimize_exps.c
@@ -429,6 +429,168 @@ reduce_scale(mvc *sql, atom *a)
 }
 
 static inline sql_exp *
+simplify_isnull_isnotnull_equals_bool(visitor *v, sql_exp *e)
+{
+   /* rewrite isnull/isnotnull(x) = TRUE/FALSE => x =/<> NULL */
+   if (!(is_compare(e->type) && (e->flag == cmp_equal || e->flag == 
cmp_notequal)))
+   return e;
+   sql_exp *l = e->l;
+   sql_exp *r = e->r;
+
+   /*if (is_atom(r->type) && r->l &&*/
+   /*strcmp(((atom*)r->l)->tpe.type->base.name, "boolean") != 0)*/
+   /*return e;*/
+
+   if (!is_func(l->type))
+   return e;
+
+   sql_subfunc *f = l->f;
+   if (f->func->s || (!is_isnull_func(f) && !is_isnotnull_func(f)))
+   return e;
+
+   list *args = l->l;
+   sql_exp *ie = args->h->data;
+
+   if (!has_nil(ie) || exp_is_not_null(ie)) {
+   if (is_isnull_func(f)) {
+   /* is null on something that is never null, is always 
false */
+   ie = exp_atom_bool(v->sql->sa, 0);
+   } else if (is_isnotnull_func(f)) {
+   /* is NOT null on something that is never null, is 
always true */
+   ie = exp_atom_bool(v->sql->sa, 1);
+   }
+   v->changes++;
+   e->l = ie;
+   } else if (exp_is_null(ie)) {
+   if (is_isnull_func(f)) {
+   /* is null on something that is always null, is always 
true */
+   ie = exp_atom_bool(v->sql->sa, 1);
+   } else if (is_isnotnull_func(f)) {
+   /* is NOT null on something that is always null, is 
always false */
+   ie = exp_atom_bool(v->sql->sa, 0);
+   }
+   v->changes++;
+   e->l = ie;
+   } else if (is_atom(r->type) && r->l) {
+   /* direct literal */
+   atom *a = r->l;
+
+   if (a->isnull) {
+   if (is_semantics(e)) {
+   /* isnull/isnotnull(x) = NULL -> false,
+* isnull/isnotnull(x) <> NULL -> true */
+   int flag = e->flag == cmp_notequal;
+   if (is_anti(e))
+   flag = !flag;
+   e = exp_atom_bool(v->sql->sa, flag);
+   } else {
+   /* always NULL */
+   e = exp_null(v->sql->sa, 
sql_bind_localtype("bit"));
+   }
+   v->changes++;
+   } else {
+   /* case isnull(x)  = TRUE  => x  = NULL */
+   /* case isnull(x) != TRUE  => x != NULL */
+   /* case isnull(x)  = FALSE => x != NULL <-- op switch */
+   /* case isnull(x) != FALSE => x  = NULL <-- op switch */
+   /* case isnotnull(x)  = TRUE  => x != NULL <-- op 
switch */
+   /* case isnotnull(x) != TRUE  => x  = NULL <-- op 
switch */
+   /* case isnotnull(x)  = FALSE => x  = NULL */
+   /* case isnotnull(x) != FALSE => x != NULL */
+   bool bval = a->data.val.bval;
+
+   assert(list_length(args) == 1);
+
+   l = ie;
+   if (exp_subtype(l)->type) {
+   r = exp_atom(v->sql->sa, 
atom_general(v->sql->sa, exp_subtype(l), NULL, 0));
+   e = exp_compare(v->sql->sa, l, r, e->flag);
+   if (e) {
+   if (bval == false && is_isnull_func(f))
+   set_anti(e);
+   if (bval == true && 
is_isnotnull_func(f))
+   set_anti(e);
+   }
+   if (e)
+   set_semantics(e);
+   v->changes++;
+   }
+   }
+   }
+   return e;
+}
+
+static inline sql_exp *
+simplify_not_over_equality_exp(visitor *v, sql_exp *e) {
+   if (!(is_compare(e->type) && (e->flag == cmp_equal || e->flag == 
cmp_notequal)))
+   return e;
+   sql_exp *l = e->l;
+   sql_exp *r = e->r;
+
+   if (!is_func(l->type))
+   return e;
+   sql_subfunc *f = l->f;
+
+   if (f->func->s || !is_no

MonetDB: nested - small fixes for naming nested types

2025-01-28 Thread Niels Nes via checkin-list
Changeset: e51622df1e70 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e51622df1e70
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.c
sql/server/rel_multiset.c
Branch: nested
Log Message:

small fixes for naming nested types


diffs (83 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -4876,9 +4876,11 @@ rel2bin_project(backend *be, sql_rel *re
return NULL;
for (en = rel->exps->h; en; en = en->next) {
sql_exp *exp = en->data;
+   /* we need to ouput composite properly, for insert statements
sql_subtype *st = exp_subtype(exp);
-   if (st && st->type->composite)
+   if (rel->l && st && st->type->composite)
continue;
+   */
int oldvtop = be->mb->vtop, oldstop = be->mb->stop;
stmt *s = exp_bin(be, exp, sub, NULL /*psub*/, NULL, NULL, 
NULL, NULL, 0, 0, 0);
 
@@ -5875,8 +5877,8 @@ rel2bin_insert(backend *be, sql_rel *rel
if (!sql_insert_triggers(be, t, updates, 0))
return sql_error(sql, 10, SQLSTATE(27000) "INSERT INTO: 
triggers failed for table '%s'", t->base.name);
 
-   insert = inserts->op4.lval->h->data;
-   if (insert->nrcols == 0) {
+   insert = inserts->op4.lval->h?inserts->op4.lval->h->data:NULL;
+   if (!insert || insert->nrcols == 0) {
cnt = stmt_atom_lng(be, 1);
} else {
cnt = stmt_aggr(be, insert, NULL, NULL, sql_bind_func(sql, 
"sys", "count", sql_bind_localtype("void"), NULL, F_AGGR, true, true), 1, 0, 1);
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3296,7 +3296,7 @@ dump_header(mvc *sql, MalBlkPtr mb, list
stmt *c = n->data;
sql_subtype *t = tail_type(c);
if (t->multiset) { /* properly handle subtable */
-   printf("multiset\n");
+   printf("%multiset\n");
}
sql_alias *tname = table_name(sql->sa, c);
const char *_empty = "";
diff --git a/sql/server/rel_multiset.c b/sql/server/rel_multiset.c
--- a/sql/server/rel_multiset.c
+++ b/sql/server/rel_multiset.c
@@ -345,32 +345,33 @@ fm_project(visitor *v, sql_rel *rel)
sql_exp *e = n->data;
sql_subtype *t = exp_subtype(e);
if (t->multiset) {
+   sql_alias *cn = a_create(v->sql->sa, 
e->alias.name);
sql_exp *rowid = exps_bind_column(exps, 
exp_name(e), NULL, NULL, 0);
if (!rowid)
-   rowid = exps_bind_column(exps, 
"rowid", NULL, NULL, 0);
+   rowid = exps_bind_column2(exps, 
cn, "rowid", NULL);
rowid = exp_ref(v->sql, rowid);
append(nexps, rowid);
if (t->type->composite) {
for(node *f = 
t->type->d.fields->h; f; f = f->next) {
sql_arg *field = 
f->data;
-   sql_exp *mse = 
exps_bind_column(exps, field->name, NULL, NULL, 0);
+   sql_exp *mse = 
exps_bind_column2(exps, cn, field->name, NULL);
mse = exp_ref(v->sql, 
mse);
append(nexps, mse);
}
} else {
-   sql_exp *mse = 
exps_bind_column(exps, "elements", NULL, NULL, 0);
+   sql_exp *mse = 
exps_bind_column2(exps, cn, "elements", NULL);
mse = exp_ref(v->sql, mse);
append(nexps, mse);
}
-   sql_exp *msid = exps_bind_column(exps, 
"id", NULL, NULL, 0);
+   sql_exp *msid = exps_bind_column2(exps, 
cn, "id", NULL);
if (!msid)
-   msid = exps_bind_column(exps, 
"multisetid", NULL, NULL, 0);
+   msid = exps_bind_column2(exps, 
cn, "multisetid", NULL);
msid = exp_ref

MonetDB: nested - small fix in renumber of multiset ids

2025-01-28 Thread Niels Nes via checkin-list
Changeset: 3faf79847c40 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3faf79847c40
Modified Files:
sql/backends/monet5/sql.c
Branch: nested
Log Message:

small fix in renumber of multiset ids


diffs (12 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -1046,7 +1046,7 @@ mvc_renumber_bulk(Client cntxt, MalBlkPt
if (!bo->tsorted || !BATtkey(bo) || (bcnt && (oi[0] + (int)(bcnt-1)) != 
oi[bcnt-1]) ) {
BAT *lo = NULL;
printf("not dense %d\n", oi[0]);
-   if (BATleftjoin(&lo, NULL, i, bo, NULL, NULL, false, cnt) != 
GDK_SUCCEED) {
+   if (BATleftjoin(&lo, NULL, bo, i, NULL, NULL, false, cnt) != 
GDK_SUCCEED) {
BBPreclaim(i);
BBPreclaim(bo);
BBPreclaim(bn);
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: newjson - wip

2025-01-28 Thread svetlin via checkin-list
Changeset: 2cc10043c915 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2cc10043c915
Modified Files:
sql/backends/monet5/vaults/json/json.c
Branch: newjson
Log Message:

wip


diffs (180 lines):

diff --git a/sql/backends/monet5/vaults/json/json.c 
b/sql/backends/monet5/vaults/json/json.c
--- a/sql/backends/monet5/vaults/json/json.c
+++ b/sql/backends/monet5/vaults/json/json.c
@@ -87,13 +87,135 @@ read_json_file(JSONFileHandle *jfh)
return content;
 }
 
+typedef struct jobject {
+   struct jobject *parent;
+   list *fields;
+} jobject;
+
+static jobject *
+new_jobject(allocator *sa, jobject *parent)
+{
+   jobject *res = SA_NEW(sa, jobject);
+   res->parent = parent;
+   res->fields = sa_list(sa);
+   return res;
+}
+
+static size_t
+json2subtypes(mvc *sql, JSONterm *t, sql_alias **alias_pptr, list *types, list 
*exps, list *names, jobject **parent_pptr)
+{
+   sql_subtype *tpe = NULL;
+   sql_exp *ne = NULL;
+   sql_alias *nalias = NULL;
+   const char *cname = NULL;
+   size_t offset = 1;
+   jobject *parent = *parent_pptr;
+   sql_alias *alias = *alias_pptr;
+
+   switch(t->kind) {
+   case JSON_ARRAY:
+   tpe = sql_create_subtype(sql->sa, SA_ZNEW(sql->sa, 
sql_type), 0, 0);
+   tpe->type->composite = true;
+   tpe->multiset = MS_ARRAY;
+   cname = alias->name;
+   // append to parent fields
+   if (parent && parent->fields) {
+   sql_arg *field = sql_create_arg(sql->sa, cname, 
tpe, false); // ?inout
+   list_append(parent->fields, field);
+   }
+   ne = exp_column(sql->sa, alias, cname, tpe, CARD_MULTI, 
1, 0, 0);
+   list_append(types, tpe);
+   list_append(exps , ne);
+   list_append(names, (char*)cname);
+   nalias = &ne->alias;
+   *alias_pptr = nalias;
+   offset += json2subtypes(sql, t+1, alias_pptr, types, 
exps, names, parent_pptr);
+   break;
+   case JSON_OBJECT:
+   tpe = sql_create_subtype(sql->sa, SA_ZNEW(sql->sa, 
sql_type), 0, 0);
+   tpe->type->composite = true;
+   // new object
+   jobject *jo = new_jobject(sql->sa, parent);
+   tpe->type->d.fields = jo->fields;
+   cname = alias->name;
+   if (parent) {
+   sql_arg *field = sql_create_arg(sql->sa, cname, 
tpe, false); // ?inout
+   list_append(parent->fields, field);
+   }
+   ne = exp_column(sql->sa, alias, cname, tpe, CARD_MULTI, 
1, 0, 0);
+   set_basecol(ne);
+   ne->alias.label = -(sql->nid++);
+   list_append(exps, ne);
+   list_append(types, tpe);
+   list_append(names, (char*)cname);
+   nalias = &ne->alias;
+   *alias_pptr = nalias;
+   *parent_pptr = jo;
+   offset += json2subtypes(sql, t+1, alias_pptr, types, 
exps, names, parent_pptr);
+   break;
+   case JSON_ELEMENT:
+   cname = sa_strndup(sql->sa, t->value, t->valuelen);
+   nalias = a_create(sql->sa, cname);
+   nalias->parent = alias;
+   *alias_pptr = nalias;
+   offset += json2subtypes(sql, t+1, alias_pptr, types, 
exps, names, parent_pptr);
+   break;
+   case JSON_STRING:
+   tpe = sql_bind_localtype("str");
+   cname = alias->name;
+   // append to parent fields
+   if (parent) {
+   sql_arg *field = sql_create_arg(sql->sa, cname, 
tpe, false); // ?inout
+   list_append(parent->fields, field);
+   }
+   ne = exp_column(sql->sa, alias->parent, cname, tpe, 
CARD_MULTI, 1, 0, 0);
+   set_basecol(ne);
+   ne->alias.label = -(sql->nid++);
+   list_append(exps, ne);
+   list_append(types, tpe);
+   list_append(names, (char*)cname);
+   // adjust one level
+   *alias_pptr = alias->parent;
+   offset += json2subtypes(sql, t+1, alias_pptr, types, 
exps, names, parent_pptr);
+   break;
+   case JSON_NUMBER:
+   tpe = sql_bind_localtype("int");
+   cna

MonetDB: newjson - load json file into json column

2025-01-28 Thread svetlin via checkin-list
Changeset: 382382a88fc3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/382382a88fc3
Modified Files:
sql/backends/monet5/vaults/json/json.c
Branch: newjson
Log Message:

load json file into json column


diffs (truncated from 309 to 300 lines):

diff --git a/sql/backends/monet5/vaults/json/json.c 
b/sql/backends/monet5/vaults/json/json.c
--- a/sql/backends/monet5/vaults/json/json.c
+++ b/sql/backends/monet5/vaults/json/json.c
@@ -87,127 +87,65 @@ read_json_file(JSONFileHandle *jfh)
return content;
 }
 
-typedef struct jobject {
-   struct jobject *parent;
-   list *fields;
-} jobject;
-
-static jobject *
-new_jobject(allocator *sa, jobject *parent)
-{
-   jobject *res = SA_NEW(sa, jobject);
-   res->parent = parent;
-   res->fields = sa_list(sa);
-   return res;
-}
 
 static size_t
-json2subtypes(mvc *sql, JSONterm *t, sql_alias **alias_pptr, list *types, list 
*exps, list *names, jobject **parent_pptr)
+append_terms(allocator *sa, JSON *jt, size_t offset, BAT *b, char **error)
 {
-   sql_subtype *tpe = NULL;
-   sql_exp *ne = NULL;
-   sql_alias *nalias = NULL;
-   const char *cname = NULL;
-   size_t offset = 1;
-   jobject *parent = *parent_pptr;
-   sql_alias *alias = *alias_pptr;
-
+   JSONterm *t = jt->elm + offset;
+   char *v = NULL;
+   JSONterm *prev = offset > 0 ? (jt->elm + (offset - 1)) : NULL;
+   JSONterm *next = offset < (size_t)jt->free ? jt->elm + (offset + 1): 
NULL;
switch(t->kind) {
case JSON_ARRAY:
-   tpe = sql_create_subtype(sql->sa, SA_ZNEW(sql->sa, 
sql_type), 0, 0);
-   tpe->type->composite = true;
-   tpe->multiset = MS_ARRAY;
-   cname = alias->name;
-   // append to parent fields
-   if (parent && parent->fields) {
-   sql_arg *field = sql_create_arg(sql->sa, cname, 
tpe, false); // ?inout
-   list_append(parent->fields, field);
+   if ( (prev == NULL && next && next->kind > JSON_ARRAY)
+   || (prev && prev->kind == JSON_ARRAY) ) 
{
+   // array of basic types or array of arrays
+   v = sa_strndup(sa, t->value, t->valuelen);
+   size_t depth = 0;
+   do {
+   offset += 1;
+   next = offset < (size_t)jt->free ? 
jt->elm + offset : NULL;
+   if (next && next->kind <=JSON_ARRAY)
+   depth ++;
+   if ((depth > 0 && next && (next->kind 
== JSON_VALUE || next->kind == 0))
+   || (depth > 0 && next 
== NULL))
+   depth --;
+   } while((next && next->kind != JSON_VALUE) || 
depth > 0);
+   } else {
+   offset += 1;
}
-   ne = exp_column(sql->sa, alias, cname, tpe, CARD_MULTI, 
1, 0, 0);
-   list_append(types, tpe);
-   list_append(exps , ne);
-   list_append(names, (char*)cname);
-   nalias = &ne->alias;
-   *alias_pptr = nalias;
-   offset += json2subtypes(sql, t+1, alias_pptr, types, 
exps, names, parent_pptr);
break;
case JSON_OBJECT:
-   tpe = sql_create_subtype(sql->sa, SA_ZNEW(sql->sa, 
sql_type), 0, 0);
-   tpe->type->composite = true;
-   // new object
-   jobject *jo = new_jobject(sql->sa, parent);
-   tpe->type->d.fields = jo->fields;
-   cname = alias->name;
-   if (parent) {
-   sql_arg *field = sql_create_arg(sql->sa, cname, 
tpe, false); // ?inout
-   list_append(parent->fields, field);
-   }
-   ne = exp_column(sql->sa, alias, cname, tpe, CARD_MULTI, 
1, 0, 0);
-   set_basecol(ne);
-   ne->alias.label = -(sql->nid++);
-   list_append(exps, ne);
-   list_append(types, tpe);
-   list_append(names, (char*)cname);
-   nalias = &ne->alias;
-   *alias_pptr = nalias;
-   *parent_pptr = jo;
-   offset += json2subtypes(sql, t+1, alias_pptr, types, 
exps, names, parent_pptr);
+   v = sa_strndup(sa, t->value, t->valuelen);
+   si

MonetDB: newjson - merge nested

2025-01-28 Thread svetlin via checkin-list
Changeset: 191743cf6f37 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/191743cf6f37
Branch: newjson
Log Message:

merge nested


diffs (truncated from 302 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1403,7 +1403,6 @@ str RAstatementEnd(Client cntxt, MalBlkP
 str SQLautocommit(mvc *m);
 void SQLdestroyResult(res_table *destroy);
 void SQLengine(Client c);
-str SQLengineIntern(Client c, backend *be);
 str SQLengine_(Client c);
 str SQLescapeString(str s);
 str SQLexitClient(Client c);
@@ -1767,7 +1766,6 @@ stream *socket_wstream(SOCKET socket, co
 stream *stderr_wastream(void);
 stream *stdin_rastream(void);
 stream *stdout_wastream(void);
-stream *stream_blackhole_create(void);
 stream *stream_fwf_create(stream *restrict s, size_t num_fields, size_t 
*restrict widths, char filler);
 stream *xz_stream(stream *inner, int preset);
 
diff --git a/common/stream/CMakeLists.txt b/common/stream/CMakeLists.txt
--- a/common/stream/CMakeLists.txt
+++ b/common/stream/CMakeLists.txt
@@ -39,7 +39,6 @@ target_sources(stream
   mapi_stream.c
   memio.c
   callback.c
-  blackhole.c
   fwf.c
   text_stream.c
   $<$:openssl_stream.c>
diff --git a/common/stream/blackhole.c b/common/stream/blackhole.c
deleted file mode 100644
--- a/common/stream/blackhole.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SPDX-License-Identifier: MPL-2.0
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0.  If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright 2024, 2025 MonetDB Foundation;
- * Copyright August 2008 - 2023 MonetDB B.V.;
- * Copyright 1997 - July 2008 CWI.
- */
-
-#include "monetdb_config.h"
-#include "stream.h"
-#include "stream_internal.h"
-
-
-
-static ssize_t
-stream_blackhole_write(stream *restrict s, const void *restrict buf, size_t 
elmsize, size_t cnt)
-{
-   (void) s;
-   (void) buf;
-   (void) elmsize;
-   return (ssize_t) cnt;
-}
-
-static void
-stream_blackhole_close(stream *s)
-{
-   (void) s;
-   /* no resources to close */
-}
-
-stream *
-stream_blackhole_create(void)
-{
-   stream *s;
-   if ((s = create_stream("blackhole")) == NULL) {
-   return NULL;
-   }
-
-   s->read = NULL;
-   s->write = stream_blackhole_write;
-   s->close = stream_blackhole_close;
-   s->flush = NULL;
-   s->readonly = false;
-   return s;
-}
diff --git a/common/stream/stream.h b/common/stream/stream.h
--- a/common/stream/stream.h
+++ b/common/stream/stream.h
@@ -269,8 +269,6 @@ stream_export stream *callback_stream(
void (*destroy)(void *priv),
const char *restrict name); // used in mclient.c, for readline
 
-stream_export stream *stream_blackhole_create(void); // never used
-
 stream_export stream *stream_fwf_create(stream *restrict s, size_t num_fields, 
size_t *restrict widths, char filler); // sql.c
 
 stream_export stream *create_text_stream(stream *s);
diff --git a/monetdb5/modules/atoms/json.h b/monetdb5/modules/atoms/json.h
--- a/monetdb5/modules/atoms/json.h
+++ b/monetdb5/modules/atoms/json.h
@@ -46,7 +46,7 @@ typedef struct JSON {
int free;
 } JSON;
 
-extern JSON *JSONparse(const char *j);
-extern void JSONfree(JSON *jt);
+mal_export JSON *JSONparse(const char *j);
+mal_export void JSONfree(JSON *jt);
 
 #endif /* __JSON_H__ */
diff --git a/sql/backends/monet5/mal_backend.h 
b/sql/backends/monet5/mal_backend.h
--- a/sql/backends/monet5/mal_backend.h
+++ b/sql/backends/monet5/mal_backend.h
@@ -51,7 +51,6 @@ typedef struct backend {
 
int mvc_var;/* current variable holding the latest query 
context (used to create dependencies in mal statements) */
int rowcount;   /* when multiple insert/update/delete/truncate 
statements are present, use an accumulator to hold the total number of rows 
affected */
-   int vtop;   /* top of the variable stack 
before the current function */
int join_idx;   /* number of index joins (used in rel_bin) */
lng reloptimizer;   /* timer for optimizer phase */
 
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2478,6 +2478,8 @@ rel2bin_basetable(backend *be, sql_rel *
} else {
sql_column *c = find_sql_column(t, oname);
 
+   if (c->type.multiset || c->type.type->composite)
+   continue;
fcol = c;
col = stmt_col(be, c, multiset?dels:NULL, 
dels->partition);
}
@@ -2512,6 +2514,8 @@ rel2bin_basetable(backend *be, sql_rel *
dels = odels;
c = find_sql_colu

MonetDB: newjson - merge with nested

2025-01-28 Thread svetlin via checkin-list
Changeset: 9549c3a1ab79 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9549c3a1ab79
Branch: newjson
Log Message:

merge with nested


diffs (283 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2478,7 +2478,7 @@ rel2bin_basetable(backend *be, sql_rel *
} else {
sql_column *c = find_sql_column(t, oname);
 
-   if (c->type.multiset || c->type.type->composite)
+   if (!c || c->type.multiset || c->type.type->composite)
continue;
fcol = c;
col = stmt_col(be, c, multiset?dels:NULL, 
dels->partition);
@@ -4876,9 +4876,11 @@ rel2bin_project(backend *be, sql_rel *re
return NULL;
for (en = rel->exps->h; en; en = en->next) {
sql_exp *exp = en->data;
+   /* we need to ouput composite properly, for insert statements
sql_subtype *st = exp_subtype(exp);
-   if (st && st->type->composite)
+   if (rel->l && st && st->type->composite)
continue;
+   */
int oldvtop = be->mb->vtop, oldstop = be->mb->stop;
stmt *s = exp_bin(be, exp, sub, NULL /*psub*/, NULL, NULL, 
NULL, NULL, 0, 0, 0);
 
@@ -5875,8 +5877,8 @@ rel2bin_insert(backend *be, sql_rel *rel
if (!sql_insert_triggers(be, t, updates, 0))
return sql_error(sql, 10, SQLSTATE(27000) "INSERT INTO: 
triggers failed for table '%s'", t->base.name);
 
-   insert = inserts->op4.lval->h->data;
-   if (insert->nrcols == 0) {
+   insert = inserts->op4.lval->h?inserts->op4.lval->h->data:NULL;
+   if (!insert || insert->nrcols == 0) {
cnt = stmt_atom_lng(be, 1);
} else {
cnt = stmt_aggr(be, insert, NULL, NULL, sql_bind_func(sql, 
"sys", "count", sql_bind_localtype("void"), NULL, F_AGGR, true, true), 1, 0, 1);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -1046,7 +1046,7 @@ mvc_renumber_bulk(Client cntxt, MalBlkPt
if (!bo->tsorted || !BATtkey(bo) || (bcnt && (oi[0] + (int)(bcnt-1)) != 
oi[bcnt-1]) ) {
BAT *lo = NULL;
printf("not dense %d\n", oi[0]);
-   if (BATleftjoin(&lo, NULL, i, bo, NULL, NULL, false, cnt) != 
GDK_SUCCEED) {
+   if (BATleftjoin(&lo, NULL, bo, i, NULL, NULL, false, cnt) != 
GDK_SUCCEED) {
BBPreclaim(i);
BBPreclaim(bo);
BBPreclaim(bn);
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3296,7 +3296,7 @@ dump_header(mvc *sql, MalBlkPtr mb, list
stmt *c = n->data;
sql_subtype *t = tail_type(c);
if (t->multiset) { /* properly handle subtable */
-   printf("multiset\n");
+   printf("%multiset\n");
}
sql_alias *tname = table_name(sql->sa, c);
const char *_empty = "";
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
@@ -3712,7 +3712,7 @@ exp_check_composite_type(mvc *sql, sql_s
 static sql_exp *
 exp_check_multiset_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp *exp, 
check_type tpe)
 {
-   assert(t->type->composite);
+   assert(t->type->composite || t->multiset);
if (!exp_is_rel(exp) && !is_values(exp)) {
sql_subtype *et = exp_subtype(exp);
/* hard code conversion from json allowed */
@@ -3720,7 +3720,9 @@ exp_check_multiset_type(mvc *sql, sql_su
return exp_convert(sql, exp, et, t);
if (et && et->multiset == t->multiset && subtype_cmp(et, t) == 
0)
return exp;
-   return sql_error( sql, 03, SQLSTATE(42000) "cannot convert 
value into composite type '%s'", t->type->base.name);
+   if (t->type->composite)
+   return sql_error( sql, 03, SQLSTATE(42000) "cannot 
convert value into composite type '%s'", t->type->base.name);
+   return sql_error( sql, 03, SQLSTATE(42000) "cannot convert 
value into multiset type '%s[]'", t->type->base.name);
}
 
list *msvals = NULL;
@@ -3757,7 +3759,7 @@ exp_check_type(mvc *sql, sql_subtype *t,
sql_exp* nexp = NULL;
sql_subtype *fromtype = exp_subtype(exp);
 
-   if (t->type->composite) {
+   if (t->type->composite || t->multiset) {
if (t->multiset || !is_row(exp))
return exp_check_multiset_type(sql, t, rel, exp, tpe);
return 

MonetDB: Aug2024 - fix join order for filter functions

2025-01-28 Thread Niels Nes via checkin-list
Changeset: af680d55374e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/af680d55374e
Modified Files:
sql/server/rel_optimize_sel.c
Branch: Aug2024
Log Message:

fix join order for filter functions


diffs (69 lines):

diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -2029,7 +2029,7 @@ find_fk( mvc *sql, list *rels, list *exp
 }
 
 static int
-rels_find_one_rel( sql_rel **rels, int nr, sql_exp *e)
+exp_find_one_rel( sql_rel **rels, int nr, sql_exp *e)
 {
int fnd = 0;
 
@@ -2043,6 +2043,22 @@ rels_find_one_rel( sql_rel **rels, int n
return fnd;
 }
 
+static int
+exps_find_one_rel( sql_rel **rels, int nr, list *exps)
+{
+   int fnd = 0;
+
+   for(node *n = exps->h; n; n = n->next) {
+   int nfnd = exp_find_one_rel(rels, nr, n->data);
+   if (nfnd != fnd && fnd)
+   return 0;
+   fnd = nfnd;
+   if (!fnd)
+   return 0;
+   }
+   return fnd;
+}
+
 /* TODO move popcount and popcount64 into gdk_*.h, used in gdk_cand, strimps 
and here */
 static inline int
 popcount64(uint64_t x)
@@ -2116,18 +2132,16 @@ order_joins(visitor *v, list *rels, list
 
h[ci] = r1[ci] = r2[ci] = 0;
r3[ci] = 0;
-   /* h[ci] = exp_find_rels(cje, rels) */
-   if (cje->type != e_cmp || !is_complex_exp(cje->flag) || 
!find_prop(cje->p, PROP_HASHCOL) ||
-  (cje->type == e_cmp && cje->f == NULL)) {
+   if (cje->type == e_cmp) {
cje->tmp = ci;
-   r1[ci] = rels_find_one_rel(rels_a, nr_rels, cje->l);
-   r2[ci] = rels_find_one_rel(rels_a, nr_rels, cje->r);
+   r1[ci] = cje->flag == cmp_filter ? 
exps_find_one_rel(rels_a, nr_rels, cje->l) : exp_find_one_rel(rels_a, nr_rels, 
cje->l);
+   r2[ci] = cje->flag == cmp_filter ? 
exps_find_one_rel(rels_a, nr_rels, cje->r) : exp_find_one_rel(rels_a, nr_rels, 
cje->r);
if (r1[ci])
h[ci] |= ((ulng)1)<<((r1[ci]-1)%64);
if (r2[ci])
h[ci] |= ((ulng)1)<<((r2[ci]-1)%64);
-   if (cje->f) {
-   r3[ci] = rels_find_one_rel(rels_a, nr_rels, 
cje->f);
+   if (cje->f && cje->flag != cmp_filter) {
+   r3[ci] = exp_find_one_rel(rels_a, nr_rels, 
cje->f);
if (r3[ci] == r2[ci])
r3[ci] = 0;
if (r3[ci])
@@ -2148,8 +2162,7 @@ order_joins(visitor *v, list *rels, list
 * */
if (0 && popcount64(h[cje->tmp]) > 2)
assert(0);
-   if (cje->type != e_cmp || !is_complex_exp(cje->flag) || 
!find_prop(cje->p, PROP_HASHCOL) ||
-   (cje->type == e_cmp && cje->f == NULL)) {
+   if (cje->type == e_cmp) {
l = rels_a[r1[cje->tmp]];
r = rels_a[r2[cje->tmp]];
if (l && r)
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: newjson - adjust column type

2025-01-28 Thread svetlin via checkin-list
Changeset: d5f6b41f4c50 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d5f6b41f4c50
Modified Files:
sql/backends/monet5/vaults/json/json.c
Branch: newjson
Log Message:

adjust column type


diffs (70 lines):

diff --git a/sql/backends/monet5/vaults/json/json.c 
b/sql/backends/monet5/vaults/json/json.c
--- a/sql/backends/monet5/vaults/json/json.c
+++ b/sql/backends/monet5/vaults/json/json.c
@@ -138,12 +138,12 @@ append_terms(allocator *sa, JSON *jt, si
offset +=1;
break;
default:
-   *error = createException(SQL, "json.appent_terms", 
"unknown json term");
+   *error = createException(SQL, "json.append_terms", 
"unknown json term");
break;
}
if (v) {
if (BUNappend(b, v, false) != GDK_SUCCEED) {
-   *error = createException(SQL, "json.appent_terms", 
"BUNappend failed!");
+   *error = createException(SQL, "json.append_terms", 
"BUNappend failed!");
}
}
return offset;
@@ -157,9 +157,11 @@ json_relation(mvc *sql, sql_subfunc *f, 
char *res = MAL_SUCCEED;
list *types = sa_list(sql->sa);
list *names = sa_list(sql->sa);
+   // use file name as columnn name ?
char *cname = sa_strdup(sql->sa, "json");
list_append(names, cname);
sql_subtype *tpe = sql_bind_localtype("str");
+   tpe->type->base.name = "json";
list_append(types, tpe);
sql_exp *ne = exp_column(sql->sa, a_create(sql->sa, tname), cname, tpe, 
CARD_MULTI, 1, 0, 0);
set_basecol(ne);
@@ -196,10 +198,13 @@ json_load(void *BE, sql_subfunc *f, char
return s;
 }
 
+int TYPE_json;
+
 static str
 JSONprelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
(void)cntxt; (void)mb; (void)stk; (void)pci;
+   TYPE_json = ATOMindex("json");
 
fl_register("json", &json_relation, &json_load);
return MAL_SUCCEED;
@@ -213,6 +218,7 @@ JSONepilogue(void *ret)
return MAL_SUCCEED;
 }
 
+
 static str
 JSONread_json(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
@@ -232,7 +238,7 @@ JSONread_json(Client cntxt, MalBlkPtr mb
jt = JSONparse(json_str);
if (jt) {
if (jt->error == NULL) {
-   b = COLnew(0, TYPE_str, 0, TRANSIENT);
+   b = COLnew(0, TYPE_json, 0, TRANSIENT);
size_t offset = 0;
char *error = NULL;
// append terms
@@ -265,7 +271,7 @@ JSONread_json(Client cntxt, MalBlkPtr mb
 static mel_func json_init_funcs[] = {
pattern("json", "prelude", JSONprelude, false, "", noargs),
command("json", "epilogue", JSONepilogue, false, "", noargs),
-   pattern("json", "read_json", JSONread_json, false, "Reads json file 
into a table", args(1,2, batarg("", str), arg("filename", str))),
+   pattern("json", "read_json", JSONread_json, false, "Reads json file 
into a table", args(1,2, batarg("", json), arg("filename", str))),
 { .imp=NULL }
 };
 
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: const_aggr_elim - rel_const_aggr_elim optimizer cleanup...

2025-01-28 Thread Wolf Schulz via checkin-list
Changeset: ac61e956045b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ac61e956045b
Modified Files:
sql/server/rel_optimize_proj.c
Branch: const_aggr_elim
Log Message:

rel_const_aggr_elim optimizer cleanup and improved


diffs (109 lines):

diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -2501,11 +2501,22 @@ rel_distinct_aggregate_on_unique_values(
return rel;
 }
 
+// Triggers On...
+// select 1 having true;
+// select 42 from foo group by ();
+// select n from foo group by rollup(n);
+
+// Does this also trigger?
+// plan SELECT avg(a) FROM baz GROUP BY pass HAVING pass = 1439;
+
+// Expiriment with ROLL UP!
+
 static inline sql_rel *
 rel_remove_const_aggr(visitor *v, sql_rel *rel)
 {
-   if (!rel)
+   if (!rel) {
return rel;
+   }
if (rel && is_groupby(rel->op) && list_length(rel->exps) >= 1 && 
!rel_is_ref(rel)) {
int needed = 0;
for (node *n = rel->exps->h; n; n = n->next) {
@@ -2524,6 +2535,7 @@ rel_remove_const_aggr(visitor *v, sql_re
if (exp_is_atom(exp))
atoms++;
}
+   /* possible edge case, never triggers in 
coverage tests */
if (atoms == list_length(rel->r)) {
list *nexps = sa_list(v->sql->sa);
for (node *n = rel->exps->h; n; ) {
@@ -3029,42 +3041,41 @@ static inline sql_rel *
 rel_const_aggr_elimination(visitor *v, sql_rel *rel)
 {
sql_rel *g = rel->l;
-
-   if (rel->op == op_project && g) // 0
+   
+   if(rel->op != op_project || !g)
+   {
+   return rel;
+   }
+
+   list *exps = g->exps;
+
+   if(g->op != op_groupby || list_empty(exps) || list_empty(g->r))
{
-   list *exps = g->exps;
-
-   if(g->op == op_groupby && !list_empty(exps) && 
!list_empty(g->r))
+   return rel;
+   }
+
+   for(node *n = exps->h; n; n = n->next)
+   {
+   sql_exp *e = n->data;
+
+   if(e->type == e_aggr &&
+  !((sql_subfunc *)e->f)->func->s &&
+  strcmp(((sql_subfunc *)e->f)->func->base.name, "count") != 0 
&& 
+  ((sql_subfunc *)e->f)->func->system == 1
+ )
{
-   for(node *n = exps->h; n; n = n->next)
+   list *se = e->l;
+
+   for(node *m = se->h; m; m = m->next)
{
-   sql_exp *e = n->data;
-
-   // Check aggr type! exp_aggr_is_count(e)
-   if(e->type == e_aggr && 
-   !((sql_subfunc *)e->f)->func->s && 
-   strcmp(((sql_subfunc *)e->f)->func->base.name, 
"avg") == 0)
+   sql_exp *w = m->data;
+
+   if(w->type == e_atom && w->card == CARD_ATOM)
{
-   list *se = e->l;
-
-   for(node *m = se->h; m; m = m->next)
-   {
-   sql_exp *w = m->data;
-
-   if(w->type == e_atom && w->card 
== CARD_ATOM)
-   {
-   
exp_setalias(w,e->alias.label,e->alias.rname,e->alias.name);
-
-   n->data = w;
-
-   // Alternative;
-   
//list_append_before(g->exps,n,w);
-   //m->data = NULL;
-   
//list_remove_node(g->exps,NULL,n);
-
-   v->changes++;
-   }
-   }
+   
exp_setalias(w,e->alias.label,e->alias.rname,e->alias.name);
+
+   n->data = w;
+   v->changes++;
}
}
}
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org