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