MonetDB: newjson - lookup json subtype correctly
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
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
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
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
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 ...
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
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
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
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
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
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
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
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
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
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
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...
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