Changeset: df058ebf2575 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=df058ebf2575
Modified Files:
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_01.stable.out
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/vaults/bam/Tests/query2.1.stable.out
        sql/backends/monet5/vaults/bam/Tests/query2.10.stable.out
        sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
        sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
        sql/common/sql_types.h
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/server/sql_atom.c
        sql/server/sql_atom.h
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        
sql/test/BugTracker-2012/Tests/scalar_subquery_with_alias.Bug-3093.stable.out
        
sql/test/BugTracker-2016/Tests/nested-subquery-in-select.Bug-6125.stable.out
        
sql/test/BugTracker-2017/Tests/crash_on_count_div_count.Bug-6201.stable.out
        sql/test/Tests/marcin1.stable.out
Branch: Jul2017
Log Message:

fixed bug 6443, keep value returning subqueries in a seperate list.


diffs (truncated from 926 to 300 lines):

diff --git a/sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_01.stable.out 
b/sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_01.stable.out
--- a/sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_01.stable.out
+++ b/sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_01.stable.out
@@ -57,10 +57,10 @@ Ready.
 % a,   d,      s # name
 % double,      int,    clob # type
 % 24,  1,      5 # length
+[ 42,  1,      NULL    ]
 [ 46,  4,      "hello" ]
 [ 45,  3,      NULL    ]
 [ 44,  2,      NULL    ]
-[ 42,  1,      NULL    ]
 #DROP TABLE mytable;
 #DROP ALL LOADER myfunc;
 #CREATE LOADER myfunc() LANGUAGE PYTHON {
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -555,6 +555,17 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        s = bin_find_column(be, right, e->l, e->r);
                if (!s && left) 
                        s = bin_find_column(be, left, e->l, e->r);
+               if (!s) {
+                       sql_rel *rel = mvc_find_subquery(be->mvc, 
e->l?e->l:e->r, e->r);
+
+                       if (rel) { 
+                               stmt *s = rel->p;
+
+                               if (s && s->type == st_list)
+                                       s = bin_find_column(be, s, 
e->l?e->l:e->r, e->r);
+                               return s; /* ugh */
+                       }
+               }
                if (s && grp)
                        s = stmt_project(be, ext, s);
                if (!s && right) {
@@ -1061,6 +1072,7 @@ rel_parse_value(backend *be, char *query
        bstream *bs;
 
        m->qc = NULL;
+       m->sqs = NULL;
 
        m->caching = 0;
        m->emode = emode;
@@ -2871,6 +2883,7 @@ sql_parse(backend *be, sql_allocator *sa
        *o = *m;
 
        m->qc = NULL;
+       m->sqs = NULL;
 
        m->caching = 0;
        m->emode = mode;
@@ -4876,13 +4889,28 @@ subrel_bin(backend *be, sql_rel *rel, li
        return s;
 }
 
+static stmt *
+_subrel_bin(backend *be, sql_rel *rel, list *refs) 
+{
+       if (be->mvc->sqs) {
+               node *n;
+
+               for(n = be->mvc->sqs->h; n; n = n->next) {
+                       sql_var *v = n->data;
+
+                       v->rel->p = subrel_bin(be, v->rel, refs);
+               }
+       }
+       return subrel_bin(be, rel, refs);
+}
+
 stmt *
 rel_bin(backend *be, sql_rel *rel) 
 {
        mvc *sql = be->mvc;
        list *refs = sa_list(sql->sa);
        int sqltype = sql->type;
-       stmt *s = subrel_bin(be, rel, refs);
+       stmt *s = _subrel_bin(be, rel, refs);
 
        if (sqltype == Q_SCHEMA)
                sql->type = sqltype;  /* reset */
@@ -4896,7 +4924,7 @@ output_rel_bin(backend *be, sql_rel *rel
        mvc *sql = be->mvc;
        list *refs = sa_list(sql->sa);
        int sqltype = sql->type;
-       stmt *s = subrel_bin(be, rel, refs);
+       stmt *s = _subrel_bin(be, rel, refs);
 
        if (sqltype == Q_SCHEMA)
                sql->type = sqltype;  /* reset */
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -137,6 +137,7 @@ sqlcleanup(mvc *c, int err)
 {
        sql_destroy_params(c);
        sql_destroy_args(c);
+       c->sqs = NULL;
 
        if ((c->emod & mod_locked) == mod_locked) {
                /* here we should commit the transaction */
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -552,6 +552,7 @@ SQLinitClient(Client c)
                        if (m->sa)
                                sa_destroy(m->sa);
                        m->sa = NULL;
+                       m->sqs = NULL;
                }
 
 #else
@@ -596,6 +597,7 @@ SQLinitClient(Client c)
                                        if (m->sa)
                                                sa_destroy(m->sa);
                                        m->sa = NULL;
+                                       m->sqs = NULL;
                                        if (msg)
                                                p = NULL;
                                }
@@ -605,6 +607,7 @@ SQLinitClient(Client c)
                        fprintf(stderr, "!could not read createdb.sql\n");
 #endif
        } else {                /* handle upgrades */
+               m->sqs = NULL;
                if (!m->sa)
                        m->sa = sa_create();
                if (!m->sa) {
@@ -762,6 +765,7 @@ SQLinclude(Client cntxt, MalBlkPtr mb, M
        if (m->sa)
                sa_destroy(m->sa);
        m->sa = NULL;
+       m->sqs = NULL;
        (void) mb;
        return msg;
 }
@@ -989,7 +993,8 @@ SQLparser(Client c)
 
        /* sqlparse needs sql allocator to be available.  It can be NULL at
         * this point if this is a recursive call. */
-       if (!m->sa)
+       m->sqs = NULL;
+       if (!m->sa) 
                m->sa = sa_create();
        if (!m->sa) {
                mnstr_printf(out, "!Could not create SQL allocator\n");
diff --git a/sql/backends/monet5/vaults/bam/Tests/query2.1.stable.out 
b/sql/backends/monet5/vaults/bam/Tests/query2.1.stable.out
--- a/sql/backends/monet5/vaults/bam/Tests/query2.1.stable.out
+++ b/sql/backends/monet5/vaults/bam/Tests/query2.1.stable.out
@@ -36,7 +36,7 @@ Ready.
 #    FROM alig
 #    WHERE qname IN (
 #        SELECT qname
-% bam.L46,     bam.L50,        bam.L52,        bam.L54,        bam.L56 # 
table_name
+% bam.L44,     bam.L46,        bam.L50,        bam.L52,        bam.L54 # 
table_name
 % qname,       l_seq,  qual1,  r_seq,  qual2 # name
 % clob,        clob,   clob,   clob,   clob # type
 % 0,   0,      0,      0,      0 # length
diff --git a/sql/backends/monet5/vaults/bam/Tests/query2.10.stable.out 
b/sql/backends/monet5/vaults/bam/Tests/query2.10.stable.out
--- a/sql/backends/monet5/vaults/bam/Tests/query2.10.stable.out
+++ b/sql/backends/monet5/vaults/bam/Tests/query2.10.stable.out
@@ -37,7 +37,7 @@ Ready.
 #        GROUP BY qname
 #        HAVING COUNT(*) = 2
 #           AND SUM(bam.bam_flag(flag, 'firs_segm')) = 1
-% bam.L26,     bam.L30,        bam.L32,        bam.L34,        bam.L36,        
bam.L40,        bam.L42,        bam.L44,        bam.L46,        bam.L50,        
bam.L52,        bam.L54,        bam.L56,        bam.L60,        bam.L62,        
bam.L64,        bam.L66,        bam.L70,        bam.L72,        bam.L74,        
bam.L76 # table_name
+% bam.L24,     bam.L26,        bam.L30,        bam.L32,        bam.L34,        
bam.L36,        bam.L40,        bam.L42,        bam.L44,        bam.L46,        
bam.L50,        bam.L52,        bam.L54,        bam.L56,        bam.L60,        
bam.L62,        bam.L64,        bam.L66,        bam.L70,        bam.L72,        
bam.L74 # table_name
 % qname,       l_flag, l_rname,        l_pos,  l_mapq, l_cigar,        
l_rnext,        l_pnext,        l_tlen, l_seq,  qual1,  r_flag, r_rname,        
r_pos,  r_mapq, r_cigar,        r_rnext,        r_pnext,        r_tlen, r_seq,  
qual2 # name
 % clob,        smallint,       clob,   int,    smallint,       clob,   clob,   
int,    int,    clob,   clob,   smallint,       clob,   int,    smallint,       
clob,   clob,   int,    int,    clob,   clob # type
 % 0,   1,      0,      1,      1,      0,      0,      1,      1,      0,      
0,      1,      0,      1,      1,      0,      0,      1,      1,      0,      
0 # length
diff --git a/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out 
b/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
--- a/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
+++ b/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
@@ -36,7 +36,7 @@ Ready.
 #        GROUP BY qname
 #        HAVING COUNT(*) = 2
 #           AND SUM(bam.bam_flag(flag, 'firs_segm')) = 1
-% bam.L35,     bam.L40 # table_name
+% bam.L33,     bam.L36 # table_name
 % distance,    nr_alignments # name
 % bigint,      bigint # type
 % 3,   1 # length
diff --git a/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128 
b/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
--- a/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
+++ b/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
@@ -36,7 +36,7 @@ Ready.
 #        GROUP BY qname
 #        HAVING COUNT(*) = 2
 #           AND SUM(bam.bam_flag(flag, 'firs_segm')) = 1
-% bam.L35,     bam.L40 # table_name
+% bam.L33,     bam.L36 # table_name
 % distance,    nr_alignments # name
 % hugeint,     bigint # type
 % 3,   1 # length
diff --git a/sql/common/sql_types.h b/sql/common/sql_types.h
--- a/sql/common/sql_types.h
+++ b/sql/common/sql_types.h
@@ -35,6 +35,7 @@
 #define EC_INTERVAL(e) (e==EC_MONTH||e==EC_SEC)
 #define EC_NUMBER(e)   
(e==EC_POS||e==EC_NUM||EC_INTERVAL(e)||e==EC_DEC||e==EC_FLT)
 #define EC_COMPUTE(e)  (e==EC_NUM||e==EC_FLT)
+#define EC_BOOLEAN(e)  (e==EC_BIT||e==EC_NUM||e==EC_FLT)
 
 #define EC_TIME                12
 #define EC_DATE                13
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1306,6 +1306,19 @@ exp_is_correlation(sql_exp *e, sql_rel *
 }
 
 int
+exp_is_true(mvc *sql, sql_exp *e) 
+{
+       if (e->type == e_atom) {
+               if (e->l) {
+                       return atom_is_true(e->l);
+               } else if(sql->emode == m_normal && sql->argc > e->flag && 
EC_BOOLEAN(exp_subtype(e)->type->eclass)) {
+                       return atom_is_true(sql->args[e->flag]);
+               }
+       }
+       return 0;
+}
+
+int
 exp_is_zero(mvc *sql, sql_exp *e) 
 {
        if (e->type == e_atom) {
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -119,6 +119,7 @@ extern int exp_is_eqjoin(sql_exp *e);
 extern int exp_is_correlation(sql_exp *e, sql_rel *r );
 extern int exp_is_join_exp(sql_exp *e);
 extern int exp_is_atom(sql_exp *e);
+extern int exp_is_true(mvc *sql, sql_exp *e);
 extern int exp_is_zero(mvc *sql, sql_exp *e);
 extern int exp_is_not_null(mvc *sql, sql_exp *e);
 extern int exps_are_atoms(list *exps);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -770,16 +770,16 @@ find_fk( mvc *sql, list *rels, list *exp
                                        if (swapped) {
                                                sql_exp *s = je->l, *l = je->r;
 
-                                               t = rel_find_column(sql->sa, 
lr, s->l, TID);
-                                               i = rel_find_column(sql->sa, 
rr, l->l, iname);
+                                               t = rel_find_column(sql->sa, 
olr, s->l, TID);
+                                               i = rel_find_column(sql->sa, 
orr, l->l, iname);
                                                if (!t || !i) 
                                                        continue;
                                                je = exp_compare(sql->sa, i, t, 
cmp_equal);
                                        } else {
                                                sql_exp *s = je->r, *l = je->l;
 
-                                               t = rel_find_column(sql->sa, 
rr, s->l, TID);
-                                               i = rel_find_column(sql->sa, 
lr, l->l, iname);
+                                               t = rel_find_column(sql->sa, 
orr, s->l, TID);
+                                               i = rel_find_column(sql->sa, 
olr, l->l, iname);
                                                if (!t || !i) 
                                                        continue;
                                                je = exp_compare(sql->sa, i, t, 
cmp_equal);
@@ -1192,6 +1192,8 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel
                } else {
                        ne = exps_bind_column(f->exps, e->r, NULL);
                }
+               if (!ne) 
+                       ne = mvc_find_subexp(sql, e->l?e->l:e->r, e->r);
                if (!ne)
                        return e;
                e = NULL;
@@ -1199,6 +1201,11 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel
                        e = rel_bind_column2(sql, t, ne->l, ne->r, 0);
                if (!e && ne->r)
                        e = rel_bind_column(sql, t, ne->r, 0);
+               if (!e) {
+                       e = mvc_find_subexp(sql, ne->l?ne->l:ne->r, ne->r);
+                       if (e)
+                               e = exp_column(sql->sa, exp_relname(e), 
exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e));
+               }
                sql->session->status = 0;
                sql->errstr[0] = 0;
                if (!e && exp_is_atom(ne))
@@ -3194,7 +3201,7 @@ rel_merge_union(int *changes, mvc *sql, 
 }
 
 static int
-exps_cse( sql_allocator *sa, list *oexps, list *l, list *r )
+exps_cse( mvc *sql, list *oexps, list *l, list *r )
 {
        list *nexps;
        node *n, *m;
@@ -3202,30 +3209,44 @@ exps_cse( sql_allocator *sa, list *oexps
        int lc = 0, rc = 0, match = 0, res = 0;
 
        /* first recusive exps_cse */
-       nexps = new_exp_list(sa);
+       nexps = new_exp_list(sql->sa);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to