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

Reply via email to