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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list