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