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",sht),arg("force",bit))),
@@ -6818,7 +6865,8 @@ static mel_func sql_init_funcs[] = {
pattern("sql", "stop_vacuum", SQLstr_stop_vacuum, true, "stop auto vacuum",
args(0,2, arg("sname",str),arg("tname",str))),
pattern("sql", "check", SQLcheck, false, "Return sql string of check
constraint.", args(1,3, arg("sql",str), arg("sname", str), arg("name", str))),
pattern("sql", "read_dump_rel", SQLread_dump_rel, false, "Reads sql_rel
string into sql_rel object and then writes it to the return value", args(1,2,
arg("sql",str), arg("sql_rel", str))),
- pattern("sql", "from_json", SQLfrom_json, false, "Reads json string into
table of nested structures", args(1,3, batvarargany("t",0), arg("input", json),
arg("type", ptr))),
+ pattern("sql", "from_json", SQLfrom_json, false, "Reads json string into
table of nested/multiset structures", args(1,3, batvarargany("t",0),
arg("input", json), arg("type", ptr))),
+ pattern("sql", "from_varchar", SQLfrom_varchar, false, "Reads string into
table of nested/multiset structures", args(1,3, batvarargany("t",0),
arg("input", str), arg("type", ptr))),
{ .imp=NULL }
};
#include "mal_import.h"
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
@@ -3947,7 +3947,7 @@ composite_type_resultsize(sql_subtype *t
int nr = 0;
if (t->multiset)
- nr += 1 + (t->multiset == MS_ARRAY) + t->type->composite;
+ nr += 2 + (t->multiset == MS_ARRAY);
if (t->type->composite) {
for (node *n = t->type->d.fields->h; n; n = n->next) {
sql_arg *a = n->data;
@@ -3962,13 +3962,17 @@ composite_type_resultsize(sql_subtype *t
static int
composite_type_result(backend *be, InstrPtr q, sql_subtype *t)
{
- if (t->type->composite) {
+ if (t->multiset || t->type->composite) {
if (t->multiset) /* id col : rowid */
q = pushReturn(be->mb, q, newTmpVariable(be->mb,
newBatType(TYPE_int)));
- for (node *n = t->type->d.fields->h; n; n = n->next) {
- sql_arg *a = n->data;
- if (composite_type_result(be, q, &a->type) != 0)
- return -1;
+ if (t->type->composite) {
+ for (node *n = t->type->d.fields->h; n; n = n->next) {
+ sql_arg *a = n->data;
+ if (composite_type_result(be, q, &a->type) != 0)
+ return -1;
+ }
+ } else {
+ q = pushReturn(be->mb, q, newTmpVariable(be->mb,
newBatType(t->type->localtype)));
}
if (t->multiset) /* msid */
q = pushReturn(be->mb, q, newTmpVariable(be->mb,
newBatType(TYPE_int)));
@@ -4008,7 +4012,54 @@ stmt_from_json(backend *be, stmt *v, stm
goto bailout;
}
s->op1 = v;
- s->nrcols = nrcols; /* function without arguments returns single
value */
+ s->nrcols = nrcols?2:1;
+ s->key = v->key;
+ s->aggr = v->aggr;
+ s->op4.typeval = *t;
+ s->nr = getDestVar(q);
+ s->q = q;
+ //s->cand = pushed ? sel : NULL;
+ pushInstruction(be->mb, q);
+ /* for each result create stmt_result and return stmt list */
+ list *r = sa_list(be->mvc->sa);
+ for(int i = 0; i < nrcols; i++)
+ append(r, stmt_result(be, s, i));
+ return stmt_list(be, r);
+bailout:
+ if (be->mvc->sa->eb.enabled)
+ eb_error(&be->mvc->sa->eb, be->mvc->errstr[0] ? be->mvc->errstr
: be->mb->errors ? be->mb->errors : *GDKerrbuf ? GDKerrbuf : "out of memory",
1000);
+ return NULL;
+}
+
+static stmt *
+stmt_from_varchar(backend *be, stmt *v, stmt *sel, sql_subtype *t)
+{
+ (void)sel;
+ int nrcols = composite_type_resultsize(t);
+
+ InstrPtr q = newStmtArgs(be->mb, "sql", "from_varchar", nrcols + 2);
+ if (q == NULL)
+ goto bailout;
+
+ q->retc = q->argc = 0;
+ if (composite_type_result(be, q, t) != 0) {
+ freeInstruction(q);
+ goto bailout;
+ }
+
+ q = pushArgument(be->mb, q, v->nr);
+ q = pushPtr(be->mb, q, t);
+
+ bool enabled = be->mvc->sa->eb.enabled;
+ be->mvc->sa->eb.enabled = false;
+ stmt *s = stmt_create(be->mvc->sa, st_convert);
+ be->mvc->sa->eb.enabled = enabled;
+ if(!s) {
+ freeInstruction(q);
+ goto bailout;
+ }
+ s->op1 = v;
+ s->nrcols = nrcols?2:1;
s->key = v->key;
s->aggr = v->aggr;
s->op4.typeval = *t;
@@ -4042,6 +4093,8 @@ stmt_convert(backend *be, stmt *v, stmt
if (f->type->eclass == EC_EXTERNAL && t->type->composite &&
strcmp(f->type->base.name, "json") == 0)
return stmt_from_json(be, v, sel, t);
+ if (EC_VARCHAR(f->type->eclass) && (t->type->composite || t->multiset))
+ return stmt_from_varchar(be, v, sel, t);
if (f->type->eclass != EC_EXTERNAL && t->type->eclass != EC_EXTERNAL &&
/* general cases */
((t->type->localtype == f->type->localtype && t->type->eclass
== f->type->eclass &&
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
@@ -3718,6 +3718,8 @@ exp_check_multiset_type(mvc *sql, sql_su
/* hard code conversion from json allowed */
if (strcmp(et->type->base.name, "json") == 0)
return exp_convert(sql, exp, et, t);
+ if (EC_VARCHAR(et->type->eclass))
+ return exp_convert(sql, exp, et, t);
if (et && et->multiset == t->multiset && subtype_cmp(et, t) ==
0)
return exp;
if (t->type->composite)
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
@@ -240,7 +240,7 @@ fm_project_ms(visitor *v, sql_exp *e, sq
//sql_subtype *oidtype = sql_bind_localtype("oid");
sql_subtype *inttype = sql_bind_localtype("int");
int label = v->sql->label;
- v->sql->label += 2 + (t->multiset == MS_ARRAY) +
list_length(t->type->d.fields);
+ v->sql->label += 2 + (t->multiset == MS_ARRAY) +
(t->type->composite?list_length(t->type->d.fields):1);
e = exp_ref(v->sql, e);
sql_exp *mse = exp_column(v->sql->sa, cn, "rowid", inttype, 1,1, 1, 1);
mse->alias.label = (++label);
diff --git
a/sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.test
b/sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.test
---
a/sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.test
+++
b/sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.test
@@ -27,5 +27,5 @@ WHERE columns.table_id = tables.id
'objects', 'keys', 'modules', 'sequences')
ORDER BY TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION
----
-1178 values hashing to 6976ccdc7572fb904e6a9eebae5b5af3
+1197 values hashing to 56f3defdf3e9070754bc7e49db1c6fd4
diff --git a/sql/test/BugTracker-2014/Tests/crash_on_or_with_in.Bug-3461.test
b/sql/test/BugTracker-2014/Tests/crash_on_or_with_in.Bug-3461.test
--- a/sql/test/BugTracker-2014/Tests/crash_on_or_with_in.Bug-3461.test
+++ b/sql/test/BugTracker-2014/Tests/crash_on_or_with_in.Bug-3461.test
@@ -1,4 +1,4 @@
-query IITTIIII rowsort
+query IITTIIIII rowsort
SELECT * FROM SYS.ARGS
WHERE FUNC_ID NOT IN (SELECT ID FROM SYS.FUNCTIONS)
OR FUNC_ID NOT IN (SELECT ID FROM SYS.FUNCTIONS)
diff --git a/sql/test/BugTracker-2014/Tests/in_incorrect_multi.Bug-3462.test
b/sql/test/BugTracker-2014/Tests/in_incorrect_multi.Bug-3462.test
--- a/sql/test/BugTracker-2014/Tests/in_incorrect_multi.Bug-3462.test
+++ b/sql/test/BugTracker-2014/Tests/in_incorrect_multi.Bug-3462.test
@@ -2,7 +2,7 @@ statement error
SELECT * FROM SYS.ARGS
WHERE FUNC_ID NOT IN (SELECT * FROM SYS.FUNCTIONS)
-query IITTIIII rowsort
+query IITTIIIII rowsort
SELECT * FROM SYS.ARGS
WHERE FUNC_ID NOT IN (SELECT FUNC_ID FROM SYS.FUNCTIONS)
----
diff --git
a/sql/test/BugTracker-2019/Tests/alter_table_set_schema.Bug-6701.test
b/sql/test/BugTracker-2019/Tests/alter_table_set_schema.Bug-6701.test
--- a/sql/test/BugTracker-2019/Tests/alter_table_set_schema.Bug-6701.test
+++ b/sql/test/BugTracker-2019/Tests/alter_table_set_schema.Bug-6701.test
@@ -1,8 +1,8 @@
-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)
----
@@ -98,11 +98,11 @@ select count(*) as count_rows from sys.o
----
1
-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)
----
@@ -129,11 +129,11 @@ SELECT * FROM sys.dependencies WHERE dep
statement ok
drop table sys.test2
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]