Changeset: 9cc4da33b6d8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9cc4da33b6d8
Modified Files:
monetdb5/mal/mal_embedded.c
sql/backends/monet5/CMakeLists.txt
sql/backends/monet5/sql.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/vaults/CMakeLists.txt
sql/backends/monet5/vaults/json/CMakeLists.txt
sql/backends/monet5/vaults/monetdb/CMakeLists.txt
sql/server/rel_exp.c
sql/test/nested/Tests/fileloader.test.in
tools/mserver/mserver5.c
Branch: nested
Log Message:
dynamicaly load the json_loader (fix symbol usage on windows)
convert 2 json wip
diffs (297 lines):
diff --git a/monetdb5/mal/mal_embedded.c b/monetdb5/mal/mal_embedded.c
--- a/monetdb5/mal/mal_embedded.c
+++ b/monetdb5/mal/mal_embedded.c
@@ -122,7 +122,7 @@ malEmbeddedBoot(int workerlimit, int mem
MT_thread_set_qry_ctx(qc_old);
return msg;
}
- char *modules[7] = { "embedded", "sql", "generator", "udf", "csv",
"monetdb_loader" };
+ char *modules[8] = { "embedded", "sql", "generator", "udf", "csv",
"monetdb_loader", "json_loader" };
if ((msg = malIncludeModules(c, modules, 0, !with_mapi_server, NULL))
!= MAL_SUCCEED) {
MCcloseClient(c);
MT_thread_set_qry_ctx(qc_old);
diff --git a/sql/backends/monet5/CMakeLists.txt
b/sql/backends/monet5/CMakeLists.txt
--- a/sql/backends/monet5/CMakeLists.txt
+++ b/sql/backends/monet5/CMakeLists.txt
@@ -187,7 +187,6 @@ target_include_directories(sql
target_link_libraries(sql
PRIVATE
monetdb_config_header
- json
sqlstorage
sqlcommon
batstore
@@ -227,7 +226,6 @@ install(TARGETS
DESTINATION ${CMAKE_INSTALL_LIBDIR})
add_subdirectory(generator)
-add_subdirectory(vaults/json)
if(WITH_UDF)
add_subdirectory(UDF)
endif()
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
@@ -5722,28 +5722,20 @@ SQLnormalize_monetdb_url(Client cntxt, M
return MAL_SUCCEED;
}
-#if 0
static str
-insert_json(JSON *js, BAT *bats, int nr, int elm, sql_subtype *t)
+SQLto_json(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- for (int i = elm; i < js->free; i++) {
- JSONterm *jt = js->elm+i;
-
- switch (jt->kind) {
- case JSON_OBJECT:
- case JSON_ARRAY:
- case JSON_ELEMENT: // field
- case JSON_VALUE:
- case JSON_STRING:
- case JSON_NUMBER:
- case JSON_BOOL:
- case JSON_NULL:
- printf("%s\n", jt->name);
- }
- }
+ (void)cntxt;
+ (void)mb;
+ str *res = (str*)getArgReference(stk, pci, 0);
+ sql_subtype *ft = *(sql_subtype**)getArgReference(stk, pci, pci->retc);
+
+ if (!ft->type->composite && !ft->multiset) {
+ throw(SQL, "SQLto_json", SQLSTATE(42000) "Invalid sql type:
%s", ft->type->base.name);
+ }
+ *res = GDKstrdup("");
return MAL_SUCCEED;
}
-#endif
static int insert_json_object(char **msg, JSON *js, BAT **bats, int *BO, int
nr, int elm, sql_subtype *t);
static int insert_json_array(char **msg, JSON *js, BAT **bats, int *BO, int
nr, int elm, sql_subtype *t);
@@ -7014,8 +7006,9 @@ static mel_func sql_init_funcs[] = {
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", "normalize_monetdb_url", SQLnormalize_monetdb_url, false,
"Normalize mapi:monetdb://, monetdb:// or monetdbs:// URL", args(1,2,
arg("",str),arg("u",str))),
- pattern("sql", "from_json", SQLfrom_json, false, "Reads json string into
table of nested/multiset structures", args(1,3, batvarargany("t",0),
optbatarg("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),
optbatarg("input", str), arg("type", ptr))),
+ pattern("sql", "from_json", SQLfrom_json, false, "Converts json string into
table of nested/multiset structures", args(1,3, batvarargany("t",0),
optbatarg("input", json), arg("type", ptr))),
+ pattern("sql", "to_json", SQLto_json, false, "Convert complex type into
json", args(1,3, arg("res", json), arg("type", ptr), batvarargany("t",0))),
+ pattern("sql", "from_varchar", SQLfrom_varchar, false, "Converts string into
table of nested/multiset structures", args(1,3, batvarargany("t",0),
optbatarg("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
@@ -4081,6 +4081,55 @@ composite_type_result(backend *be, Instr
return i;
}
+static void
+nested_to_json(backend *be, InstrPtr q, list *l)
+{
+ for(node *n = l->h; n; n = n->next) {
+ stmt *s = n->data;
+ if (s->nested) {
+ nested_to_json(be, q, unnest_stmt(s));
+ } else {
+ pushArgument(be->mb, q, s->nr);
+ }
+ }
+}
+
+static stmt *
+stmt_to_json(backend *be, stmt *v, stmt *sel, sql_subtype *f, sql_subtype *t)
+{
+ /* to_json(json res, ptr st, bats vararg) 1, 3 */
+ int nrcols = nested_len(unnest_stmt(v));
+ (void)sel;
+
+ InstrPtr q = newStmtArgs(be->mb, "sql", "to_json", nrcols + 2);
+ setVarType(be->mb, getArg(q, 0), t->type->localtype);
+ q = pushPtr(be->mb, q, f);
+ nested_to_json(be, q, unnest_stmt(v));
+
+ 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 = 2;
+ s->key = v->key;
+ s->aggr = v->aggr;
+ s->subtype = *t;
+ s->nr = getDestVar(q);
+ s->q = q;
+ //s->cand = pushed ? sel : NULL;
+ pushInstruction(be->mb, q);
+ return s;
+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;
+}
+
/* for each result create stmt_result and return stmt list */
static stmt *
result_list(backend *be, InstrPtr q, int cur, result_subtype *tps, int nrcols)
@@ -4206,6 +4255,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 (t->type->eclass == EC_EXTERNAL && f->type->composite &&
strcmp(t->type->base.name, "json") == 0)
+ return stmt_to_json(be, v, sel, f, 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 &&
diff --git a/sql/backends/monet5/vaults/CMakeLists.txt
b/sql/backends/monet5/vaults/CMakeLists.txt
--- a/sql/backends/monet5/vaults/CMakeLists.txt
+++ b/sql/backends/monet5/vaults/CMakeLists.txt
@@ -15,5 +15,6 @@ add_subdirectory(netcdf)
add_subdirectory(shp)
add_subdirectory(csv)
add_subdirectory(monetdb)
+add_subdirectory(json)
add_subdirectory(odbc)
diff --git a/sql/backends/monet5/vaults/json/CMakeLists.txt
b/sql/backends/monet5/vaults/json/CMakeLists.txt
--- a/sql/backends/monet5/vaults/json/CMakeLists.txt
+++ b/sql/backends/monet5/vaults/json/CMakeLists.txt
@@ -10,18 +10,17 @@
# Copyright 1997 - July 2008 CWI.
#]]
-add_library(json OBJECT)
-#if(MONETDB_STATIC)
-# add_library(json STATIC)
-#else()
-# add_library(json SHARED)
-#endif()
+if(MONETDB_STATIC)
+ add_library(json_loader STATIC)
+else()
+ add_library(json_loader MODULE)
+endif()
-target_sources(json
+target_sources(json_loader
PRIVATE
json.c)
-target_include_directories(json
+target_include_directories(json_loader
PRIVATE
$<TARGET_PROPERTY:mal,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:malmodules,INTERFACE_INCLUDE_DIRECTORIES>
@@ -33,15 +32,22 @@ target_include_directories(json
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${INCLUDEDIR}/monetdb>)
-target_link_libraries(json
+target_link_libraries(json_loader
PRIVATE
monetdb_config_header
sqlinclude
+ sql
monetdb5
bat
stream
)
-set_target_properties(json
+set_target_properties(json_loader
PROPERTIES
- POSITION_INDEPENDENT_CODE ON)
+ OUTPUT_NAME
+ _json_loader)
+
+install(TARGETS
+ json_loader
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/monetdb5-${MONETDB_VERSION}
+ COMPONENT server)
diff --git a/sql/backends/monet5/vaults/monetdb/CMakeLists.txt
b/sql/backends/monet5/vaults/monetdb/CMakeLists.txt
--- a/sql/backends/monet5/vaults/monetdb/CMakeLists.txt
+++ b/sql/backends/monet5/vaults/monetdb/CMakeLists.txt
@@ -10,7 +10,11 @@
# Copyright 1997 - July 2008 CWI.
#]]
-add_library(monetdb_loader MODULE)
+if(MONETDB_STATIC)
+ add_library(monetdb_loader STATIC)
+else()
+ add_library(monetdb_loader MODULE)
+endif()
target_sources(monetdb_loader
PRIVATE
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
@@ -3848,6 +3848,9 @@ exp_check_type(mvc *sql, sql_subtype *t,
sql_exp* nexp = NULL;
sql_subtype *fromtype = exp_subtype(exp);
+ if ((!fromtype || !fromtype->type) && rel_set_type_param(sql, t, rel,
exp, 0) == 0)
+ return exp;
+
if (t->type->composite || t->multiset) {
if (fromtype && subtype_cmp(t, fromtype) == 0)
return exp;
@@ -3855,16 +3858,18 @@ exp_check_type(mvc *sql, sql_subtype *t,
return exp_check_multiset_type(sql, t, rel, exp, tpe);
if (t->type->composite && (is_row(exp) || is_values(exp)))
return exp_check_composite_type(sql, t, rel, exp, tpe);
- sql_subtype *et = exp_subtype(exp);
- 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 (strcmp(fromtype->type->base.name, "json") == 0)
+ return exp_convert(sql, exp, fromtype, t);
+ if (EC_VARCHAR(fromtype->type->eclass))
+ return exp_convert(sql, exp, fromtype, t);
if (is_values(exp))
return NULL;
}
- if ((!fromtype || !fromtype->type) && rel_set_type_param(sql, t, rel,
exp, 0) == 0)
- return exp;
+
+ if (fromtype->type->composite || fromtype->multiset) {
+ if (strcmp(t->type->base.name, "json") == 0)
+ return exp_convert(sql, exp, fromtype, t);
+ }
/* first try cheap internal (in-place) conversions ! */
if ((nexp = exp_convert_inplace(sql, t, exp)) != NULL)
diff --git a/sql/test/nested/Tests/fileloader.test.in
b/sql/test/nested/Tests/fileloader.test.in
--- a/sql/test/nested/Tests/fileloader.test.in
+++ b/sql/test/nested/Tests/fileloader.test.in
@@ -15,5 +15,9 @@ select cast(t.json as event) from (selec
(1, "click")
(2, "scroll")
+query T
+select cast(cast(t.json as event) as json) from (select json from
r'$TSTSRCDIR/events.json') t
+----
+
statement ok
drop type event
diff --git a/tools/mserver/mserver5.c b/tools/mserver/mserver5.c
--- a/tools/mserver/mserver5.c
+++ b/tools/mserver/mserver5.c
@@ -371,6 +371,7 @@ main(int argc, char **av)
#endif
modules[mods++] = "csv";
modules[mods++] = "monetdb_loader";
+ modules[mods++] = "json_loader";
#ifdef HAVE_SHP
modules[mods++] = "shp";
#endif
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]