Changeset: 8f138a029920 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8f138a029920
Added Files:
sql/test/subquery/Tests/exists.sql
sql/test/subquery/Tests/exists.stable.err
sql/test/subquery/Tests/exists.stable.out
Modified Files:
monetdb5/modules/atoms/json.c
sql/backends/monet5/sql_upgrades.c
sql/server/rel_rel.c
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
sql/server/sql_parser.y
sql/test/BugTracker-2014/Tests/order_by_incorrect_error.Bug-3630.stable.err
sql/test/BugTracker-2014/Tests/order_by_incorrect_error.Bug-3630.stable.out
sql/test/BugTracker-2019/Tests/All
sql/test/BugTracker-2019/Tests/filter_json_null.Bug-6773.sql
sql/test/BugTracker-2019/Tests/filter_json_null.Bug-6773.stable.err
sql/test/BugTracker-2019/Tests/filter_json_null.Bug-6773.stable.out
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.powerpc64.int128
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.32bit
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/emptydb-upgrade/Tests/upgrade.stable.out
sql/test/emptydb-upgrade/Tests/upgrade.stable.out.32bit
sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128
sql/test/emptydb/Tests/check.stable.out
sql/test/emptydb/Tests/check.stable.out.32bit
sql/test/emptydb/Tests/check.stable.out.int128
sql/test/miscellaneous/Tests/groupby_expressions.sql
sql/test/miscellaneous/Tests/groupby_expressions.stable.err
sql/test/miscellaneous/Tests/groupby_expressions.stable.out
sql/test/subquery/Tests/All
sql/test/subquery/Tests/any_all.sql
sql/test/subquery/Tests/any_all.stable.out
sql/test/subquery/Tests/correlated.sql
sql/test/subquery/Tests/correlated.stable.err
sql/test/subquery/Tests/correlated.stable.out
sql/test/subquery/Tests/subquery2.sql
sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
Branch: default
Log Message:
Merge with Nov2019
diffs (truncated from 190993 to 300 lines):
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -512,8 +512,6 @@ JSONgetValue(JSON *jt, int idx)
if (jt->elm[idx].valuelen == 0)
return GDKstrdup(str_nil);
- if (strncmp(jt->elm[idx].value, "null", 4) == 0)
- return GDKstrdup(str_nil);
s = GDKzalloc(jt->elm[idx].valuelen + 1);
if (s)
strncpy(s, jt->elm[idx].value, jt->elm[idx].valuelen);
diff --git a/sql/backends/monet5/sql_upgrades.c
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -180,13 +180,15 @@ sql_fix_system_tables(Client c, mvc *sql
#ifdef HAVE_HGE
static str
-sql_update_hugeint(Client c, mvc *sql, const char *prev_schema)
+sql_update_hugeint(Client c, mvc *sql, const char *prev_schema, bool
*systabfixed)
{
size_t bufsize = 8192, pos = 0;
char *buf, *err;
- if ((err = sql_fix_system_tables(c, sql, prev_schema)) != NULL)
+ if (!*systabfixed &&
+ (err = sql_fix_system_tables(c, sql, prev_schema)) != NULL)
return err;
+ *systabfixed = true;
if ((buf = GDKmalloc(bufsize)) == NULL)
throw(SQL, "sql_update_hugeint", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
@@ -464,7 +466,7 @@ sql_update_jul2017_sp2(Client c)
}
static str
-sql_update_jul2017_sp3(Client c, mvc *sql, const char *prev_schema)
+sql_update_jul2017_sp3(Client c, mvc *sql, const char *prev_schema, bool
*systabfixed)
{
char *err = NULL;
sql_schema *sys;
@@ -479,10 +481,11 @@ sql_update_jul2017_sp3(Client c, mvc *sq
tab = find_sql_table(sys, "functions");
col = find_sql_column(tab, "name");
rid = table_funcs.column_find_row(sql->session->tr, col,
"sys_update_schemas", NULL);
- if (is_oid_nil(rid)) {
+ if (is_oid_nil(rid) && !*systabfixed) {
err = sql_fix_system_tables(c, sql, prev_schema);
if (err != NULL)
return err;
+ *systabfixed = true;
}
/* if there is no value "system_update_schemas" in
* sys.triggers.name, we need to add the triggers */
@@ -548,7 +551,7 @@ sql_update_mar2018_geom(Client c, sql_ta
}
static str
-sql_update_mar2018(Client c, mvc *sql, const char *prev_schema)
+sql_update_mar2018(Client c, mvc *sql, const char *prev_schema, bool
*systabfixed)
{
size_t bufsize = 30000, pos = 0;
char *buf, *err;
@@ -563,13 +566,14 @@ sql_update_mar2018(Client c, mvc *sql, c
return err;
b = BATdescriptor(output->cols[0].b);
if (b) {
- if (BATcount(b) == 0) {
+ if (BATcount(b) == 0 && !*systabfixed) {
/* if there is no value "quarter" in
* sys.functions.name, we need to update the
* sys.functions table */
err = sql_fix_system_tables(c, sql, prev_schema);
if (err != NULL)
return err;
+ *systabfixed = true;
}
BBPunfix(b->batCacheid);
}
@@ -1891,7 +1895,7 @@ sql_update_apr2019_sp1(Client c)
}
static str
-sql_update_nov2019(Client c, mvc *sql, const char *prev_schema)
+sql_update_nov2019(Client c, mvc *sql, const char *prev_schema, bool
*systabfixed)
{
size_t bufsize = 8192, pos = 0;
char *err = NULL, *buf = GDKmalloc(bufsize);
@@ -1910,12 +1914,17 @@ sql_update_nov2019(Client c, mvc *sql, c
}
b = BATdescriptor(output->cols[0].b);
if (b) {
- if (BATcount(b) > 0) {
+ if (BATcount(b) > 0 && !*systabfixed) {
err = sql_fix_system_tables(c, sql, prev_schema);
+ *systabfixed = true;
}
BBPunfix(b->batCacheid);
}
res_table_destroy(output);
+ if (err) {
+ GDKfree(buf);
+ return err;
+ }
pos = 0;
pos += snprintf(buf + pos, bufsize - pos,
@@ -2147,11 +2156,10 @@ SQLupgrades(Client c, mvc *m)
if (have_hge) {
sql_find_subtype(&tp, "hugeint", 0, 0);
if (!sql_bind_aggr(m->sa, s, "var_pop", &tp)) {
- if ((err = sql_update_hugeint(c, m, prev_schema)) !=
NULL) {
+ if ((err = sql_update_hugeint(c, m, prev_schema,
&systabfixed)) != NULL) {
fprintf(stderr, "!%s\n", err);
freeException(err);
}
- systabfixed = true;
}
}
#endif
@@ -2200,7 +2208,7 @@ SQLupgrades(Client c, mvc *m)
freeException(err);
}
- if ((err = sql_update_jul2017_sp3(c, m, prev_schema)) != NULL) {
+ if ((err = sql_update_jul2017_sp3(c, m, prev_schema, &systabfixed)) !=
NULL) {
fprintf(stderr, "!%s\n", err);
freeException(err);
}
@@ -2216,7 +2224,7 @@ SQLupgrades(Client c, mvc *m)
if (mvc_bind_schema(m, "wlc") == NULL &&
!sql_bind_func(m->sa, s, "master", NULL, NULL, F_PROC)) {
- if ((err = sql_update_mar2018(c, m, prev_schema)) != NULL) {
+ if ((err = sql_update_mar2018(c, m, prev_schema, &systabfixed))
!= NULL) {
fprintf(stderr, "!%s\n", err);
freeException(err);
}
@@ -2325,6 +2333,7 @@ SQLupgrades(Client c, mvc *m)
fprintf(stderr, "!%s\n", err);
freeException(err);
}
+ systabfixed = true;
if ((err = sql_update_apr2019(c, m, prev_schema)) != NULL) {
fprintf(stderr, "!%s\n", err);
freeException(err);
@@ -2350,7 +2359,13 @@ SQLupgrades(Client c, mvc *m)
sql_find_subtype(&tp, "string", 0, 0);
if (!sql_bind_func3(m->sa, s, "deltas", &tp, &tp, &tp, F_UNION)) {
- if ((err = sql_update_nov2019(c, m, prev_schema)) != NULL) {
+ if (!systabfixed &&
+ (err = sql_fix_system_tables(c, m, prev_schema)) != NULL) {
+ fprintf(stderr, "!%s\n", err);
+ freeException(err);
+ }
+ systabfixed = true;
+ if ((err = sql_update_nov2019(c, m, prev_schema, &systabfixed))
!= NULL) {
fprintf(stderr, "!%s\n", err);
freeException(err);
}
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -191,7 +191,7 @@ rel_issubquery(sql_rel*r)
}
static sql_rel *
-rel_bind_column_(mvc *sql, sql_rel **p, sql_rel *rel, const char *cname )
+rel_bind_column_(mvc *sql, sql_rel **p, sql_rel *rel, const char *cname)
{
int ambiguous = 0;
sql_rel *l = NULL, *r = NULL;
@@ -215,7 +215,7 @@ rel_bind_column_(mvc *sql, sql_rel **p,
if (!r || !e || !is_freevar(e)) {
*p = rel;
l = rel_bind_column_(sql, p, rel->l, cname);
- if (l && r && !rel_issubquery(r)) {
+ if (l && r && !rel_issubquery(r) &&
!is_dependent(rel)) {
(void) sql_error(sql, ERR_AMBIGUOUS,
SQLSTATE(42000) "SELECT: identifier '%s' ambiguous", cname);
return NULL;
}
@@ -244,7 +244,7 @@ rel_bind_column_(mvc *sql, sql_rel **p,
if (is_processed(rel))
return NULL;
if (rel->l && !(is_base(rel->op)))
- return rel_bind_column_(sql, p, rel->l, cname );
+ return rel_bind_column_(sql, p, rel->l, cname);
break;
case op_semi:
case op_anti:
@@ -265,7 +265,7 @@ rel_bind_column_(mvc *sql, sql_rel **p,
sql_exp *
rel_bind_column( mvc *sql, sql_rel *rel, const char *cname, int f )
{
- sql_rel *p = NULL;
+ sql_rel *p = NULL, *orel = rel;
if (is_sql_sel(f) && rel && is_simple_project(rel->op) &&
!is_processed(rel))
rel = rel->l;
@@ -276,7 +276,10 @@ rel_bind_column( mvc *sql, sql_rel *rel,
if ((is_project(rel->op) || is_base(rel->op)) && rel->exps) {
sql_exp *e = exps_bind_column(rel->exps, cname, NULL);
if (e)
- return exp_alias_or_copy(sql, exp_relname(e), cname,
rel, e);
+ e = exp_alias_or_copy(sql, exp_relname(e), cname, rel,
e);
+ if (p && e && is_simple_project(p->op) && !is_processed(p) &&
is_sql_orderby(f) && orel != rel)
+ e = rel_project_add_exp(sql, p, e);
+ return e;
}
return NULL;
}
@@ -291,6 +294,18 @@ rel_bind_column2( mvc *sql, sql_rel *rel
if (rel->exps && (is_project(rel->op) || is_base(rel->op))) {
sql_exp *e = exps_bind_column2(rel->exps, tname, cname);
+ /* in case of orderby we should also lookup the column in group
by list (and use existing references) */
+ if (!e && is_sql_orderby(f) && is_groupby(rel->op) && rel->r) {
+ e = exps_bind_alias(rel->r, tname, cname);
+ if (e) {
+ if (exp_relname(e))
+ e = exps_bind_column2(rel->exps,
exp_relname(e), exp_name(e));
+ else
+ e = exps_bind_column(rel->exps,
exp_name(e), NULL);
+ if (e)
+ return e;
+ }
+ }
if (e)
return exp_alias_or_copy(sql, tname, cname, rel, e);
}
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1818,7 +1818,7 @@ rel_compare(sql_query *query, sql_rel *r
sql->errstr[0] = 0;
query_push_outer(query, rel);
r = rel_subquery(query, NULL, ro, ek);
- query_pop_outer(query);
+ rel = query_pop_outer(query);
/* get inner queries result value, ie
get last expression of r */
@@ -2096,6 +2096,7 @@ rel_in_value_exp(sql_query *query, sql_r
tid = exp_ref(sql->sa, tid);
exps = rel_projections(sql, left, NULL, 1/*keep
names */, 1);
left = rel_add_identity(sql, left, &id);
+ //reset_processed(left);
id = exp_ref(sql->sa, id);
left = rel_crossproduct(sql->sa, left, z,
is_sql_sel(f)?op_left:op_join);
if (!l_is_value || rel_has_freevar(sql, z))
@@ -2136,7 +2137,7 @@ rel_in_value_exp(sql_query *query, sql_r
query_push_outer(query, left);
r = rel_value_exp(query, &z, n->data.sym, f /*
ie no result project */, ek);
- query_pop_outer(query);
+ left = query_pop_outer(query);
/*
if (z)
r = rel_lastexp(sql, z);
@@ -2148,6 +2149,7 @@ rel_in_value_exp(sql_query *query, sql_r
exps = rel_projections(sql, left, NULL,
1/*keep names */, 1);
left = rel_add_identity(sql, left, &id);
+ //reset_processed(left);
id = exp_ref(sql->sa, id);
z = rel_add_identity2(sql, z, &tid);
tid = exp_ref(sql->sa, tid);
@@ -2390,7 +2392,7 @@ rel_logical_value_exp(sql_query *query,
query_push_outer(query, *rel);
r = rel_subquery(query, NULL, ro, ek);
- query_pop_outer(query);
+ *rel = query_pop_outer(query);
/* get inner queries result value, ie
get last expression of r */
@@ -2553,7 +2555,7 @@ rel_logical_value_exp(sql_query *query,
query_push_outer(query, *rel);
sq = rel_subquery(query, NULL, lo, ek);
- query_pop_outer(query);
+ *rel = query_pop_outer(query);
if (!sq)
return NULL;
@@ -2868,7 +2870,7 @@ rel_in_exp(sql_query *query, sql_rel *re
query_push_outer(query, left);
r = rel_value_exp(query, &z, n->data.sym, f /*
ie no result project */, ek);
- query_pop_outer(query);
+ left = query_pop_outer(query);
if (!r)
return NULL;
if (z)
@@ -3233,7 +3235,7 @@ rel_logical_exp(sql_query *query, sql_re
query_push_outer(query, rel);
sq = rel_subquery(query, NULL, lo, ek);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list