Changeset: 4a0c7a8b305a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4a0c7a8b305a
Modified Files:
        sql/server/rel_dump.c
        sql/test/SQLancer/Tests/sqlancer17.test
Branch: Jul2021
Log Message:

Try to bind a user defined type if not found


diffs (93 lines):

diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -936,7 +936,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
        char *tname = NULL, *cname = NULL, *var_cname = NULL, *e, *b = r + 
*pos, *st;
        sql_exp *exp = NULL;
        list *exps = NULL;
-       sql_subtype *tpe;
+       sql_type *t = NULL;
+       sql_subtype tpe;
 
        quote = (r[*pos] == '"');
        b += quote;
@@ -1060,8 +1061,11 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                (*pos)++;
                        }
                        convertIdent(tname);
-                       if (!(tpe = sql_bind_subtype(sql->sa, tname, d, s)))
-                               return sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42000) "SQL type %s(%d, %d) not found\n", tname, d, s);
+                       if (!sql_find_subtype(&tpe, tname, d, s)) {
+                               if (!(t = mvc_bind_type(sql, tname))) /* try an 
external type */
+                                       return sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42000) "SQL type %s(%d, %d) not found\n", tname, d, s);
+                               sql_init_subtype(&tpe, t, d, s);
+                       }
                        skipWS(r, pos);
                        *e = old;
                        if (r[*pos] == '[') { /* convert */
@@ -1073,13 +1077,13 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                        return sql_error(sql, -1, 
SQLSTATE(42000) "Convert: missing ']'\n");
                                (*pos)++;
                                skipWS(r, pos);
-                               exp = exp_convert(sql->sa, exp, 
exp_subtype(exp), tpe);
+                               exp = exp_convert(sql->sa, exp, 
exp_subtype(exp), &tpe);
                        } else {
                                st = readString(r,pos);
                                if (st && strcmp(st, "NULL") == 0)
-                                       exp = exp_atom(sql->sa, 
atom_general(sql->sa, tpe, NULL));
+                                       exp = exp_atom(sql->sa, 
atom_general(sql->sa, &tpe, NULL));
                                else
-                                       exp = exp_atom(sql->sa, 
atom_general(sql->sa, tpe, st));
+                                       exp = exp_atom(sql->sa, 
atom_general(sql->sa, &tpe, st));
                                skipWS(r, pos);
                        }
                }
@@ -1088,13 +1092,16 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                *e = 0;
                tname = b;
                convertIdent(tname);
-               if (!(tpe = sql_bind_subtype(sql->sa, tname, 0, 0)))
-                       return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) 
"SQL type %s not found\n", tname);
+               if (!sql_find_subtype(&tpe, tname, 0, 0)) {
+                       if (!(t = mvc_bind_type(sql, tname))) /* try an 
external type */
+                               return sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42000) "SQL type %s not found\n", tname);
+                       sql_init_subtype(&tpe, t, 0, 0);
+               }
                st = readString(r,pos);
                if (st && strcmp(st, "NULL") == 0)
-                       exp = exp_atom(sql->sa, atom_general(sql->sa, tpe, 
NULL));
+                       exp = exp_atom(sql->sa, atom_general(sql->sa, &tpe, 
NULL));
                else
-                       exp = exp_atom(sql->sa, atom_general(sql->sa, tpe, st));
+                       exp = exp_atom(sql->sa, atom_general(sql->sa, &tpe, 
st));
                skipWS(r, pos);
                break;
        default:
diff --git a/sql/test/SQLancer/Tests/sqlancer17.test 
b/sql/test/SQLancer/Tests/sqlancer17.test
--- a/sql/test/SQLancer/Tests/sqlancer17.test
+++ b/sql/test/SQLancer/Tests/sqlancer17.test
@@ -367,5 +367,24 @@ select json."isvalid"(CAST(v30.vc0 AS JS
 True
 
 statement ok
+CREATE TABLE "t3" ("c0" BIGINT,"c1" INTERVAL MONTH)
+
+statement ok rowcount 6
+INSERT INTO "t3" VALUES (1, INTERVAL '9' MONTH),(5, INTERVAL '6' MONTH),(5, 
NULL),(7, NULL),(2, INTERVAL '1' MONTH),(2, INTERVAL '1' MONTH)
+
+statement ok
+CREATE REMOTE TABLE "rt3" ("c0" BIGINT,"c1" INTERVAL MONTH) ON 
'mapi:monetdb://localhost:50000/demo/sys/t3'
+
+query I rowsort
+SELECT json."integer"(JSON '1') FROM rt3
+----
+1
+1
+1
+1
+1
+1
+
+statement ok
 ROLLBACK
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to