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]

Reply via email to