Changeset: 5ca36b934b78 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5ca36b934b78
Modified Files:
        sql/server/rel_unnest.c
        sql/test/subquery/Tests/subquery3.sql
        sql/test/subquery/Tests/subquery3.stable.err
        sql/test/subquery/Tests/subquery3.stable.out
Branch: linear-hashing
Log Message:

Fixed unnesting on list of values


diffs (162 lines):

diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -50,6 +50,9 @@ exp_set_freevar(mvc *sql, sql_exp *e, sq
                set_freevar(e, 0);
                break;
        case e_atom: 
+               if (e->f)
+                       exps_set_freevar(sql, e->f, r);
+               break;
        case e_psm: 
                break;
        }
@@ -113,8 +116,11 @@ exp_has_freevar(mvc *sql, sql_exp *e)
                if (exp_is_rel(e))
                        return rel_has_freevar(sql, e->l);
                break;
-       case e_column: 
        case e_atom: 
+               if (e->f)
+                       return exps_have_freevar(sql, e->f);
+               break;
+       case e_column:
        default:
                return 0;
        }
@@ -237,6 +243,9 @@ exp_freevar(mvc *sql, sql_exp *e)
                                return rel_freevar(sql, e->l);
                return NULL;
        case e_atom:
+               if (e->f)
+                       return exps_freevar(sql, e->f);
+               return NULL;
        default:
                return NULL;
        }
@@ -449,6 +458,9 @@ push_up_project_exp(mvc *sql, sql_rel *r
                        }
                } break;        
        case e_atom: 
+               if (e->f) 
+                       e->f = push_up_project_exps(sql, rel, e->f);
+               break;
        case e_psm: 
                break;
        }
@@ -753,7 +765,19 @@ push_up_project(mvc *sql, sql_rel *rel, 
                                }
                                if (r->l)
                                        e = exp_rewrite(sql, r->l, e, ad);
-                               append(n->exps, e);
+                               if (e->type == e_atom && e->f) {
+                                       list *atoms = (list*)e->f;
+
+                                       if (list_length(atoms) > 1)
+                                               return sql_error(sql, 02, 
SQLSTATE(21000) "Cardinality violation, scalar value expected");
+                                       for (node *nn = atoms->h ; nn ; nn = 
nn->next) {
+                                               sql_exp *ee = (sql_exp *) 
nn->data;
+
+                                                exp_setname(sql->sa, ee, 
exp_relname(e), exp_name(e));
+                                               append(n->exps, ee);
+                                       }
+                               } else
+                                       append(n->exps, e);
                        }
                        if (r->r) {
                                list *exps = r->r, *oexps = n->r = 
sa_list(sql->sa);
diff --git a/sql/test/subquery/Tests/subquery3.sql 
b/sql/test/subquery/Tests/subquery3.sql
--- a/sql/test/subquery/Tests/subquery3.sql
+++ b/sql/test/subquery/Tests/subquery3.sql
@@ -532,9 +532,21 @@ FROM integers i1;
        -- NULL
 
 SELECT
+       (SELECT 1 FROM (VALUES (i1.i)) as i2(i))
+FROM integers i1;
+       -- 1
+       -- 1
+       -- 1
+       -- 1
+
+SELECT
        (SELECT i2.i FROM (VALUES (i1.i), (i1.i)) as i2(i))
 FROM integers i1; --error, more than one row returned by a subquery used as an 
expression
 
+SELECT
+       (SELECT i2.i FROM (VALUES (i1.i, i1.i), (i1.i, i1.i)) as i2(i))
+FROM integers i1; --error, more than one row returned by a subquery used as an 
expression
+
 /* We shouldn't allow the following internal functions/procedures to be called 
from regular queries */
 --SELECT "identity"(col1) FROM another_T;
 --SELECT "rowid"(col1) FROM another_T;
diff --git a/sql/test/subquery/Tests/subquery3.stable.err 
b/sql/test/subquery/Tests/subquery3.stable.err
--- a/sql/test/subquery/Tests/subquery3.stable.err
+++ b/sql/test/subquery/Tests/subquery3.stable.err
@@ -327,6 +327,18 @@ QUERY = SELECT
         FROM integers i1; --error, subquery uses ungrouped column "i1.i" from 
outer query
 ERROR = !SELECT: cannot use non GROUP BY column 'i1.i' in query results 
without an aggregate function
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-596453/.s.monetdb.32132
+QUERY = SELECT
+               (SELECT i2.i FROM (VALUES (i1.i), (i1.i)) as i2(i))
+        FROM integers i1; --error, more than one row returned by a subquery 
used as an expression
+ERROR = !Cardinality violation, scalar value expected
+CODE  = 21000
+MAPI  = (monetdb) /var/tmp/mtest-600940/.s.monetdb.32137
+QUERY = SELECT
+               (SELECT i2.i FROM (VALUES (i1.i, i1.i), (i1.i, i1.i)) as i2(i))
+        FROM integers i1; --error, more than one row returned by a subquery 
used as an expression
+ERROR = !Cardinality violation, scalar value expected
+CODE  = 21000
 
 # 17:40:41 >  
 # 17:40:41 >  "Done."
diff --git a/sql/test/subquery/Tests/subquery3.stable.out 
b/sql/test/subquery/Tests/subquery3.stable.out
--- a/sql/test/subquery/Tests/subquery3.stable.out
+++ b/sql/test/subquery/Tests/subquery3.stable.out
@@ -466,6 +466,44 @@ stdout of test 'subquery3` in directory 
 % 1 # length
 [ 1    ]
 [ 1    ]
+#SELECT
+#      (SELECT i2.i FROM (VALUES (MIN(i1.i))) as i2(i))
+#FROM integers i1;
+% .%4 # table_name
+% %4 # name
+% int # type
+% 1 # length
+[ 1    ]
+#SELECT
+#      (SELECT i2.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i))
+#FROM integers i1;
+% .%6 # table_name
+% %6 # name
+% int # type
+% 1 # length
+[ 1    ]
+#SELECT
+#      (SELECT i2.i FROM (VALUES (i1.i)) as i2(i))
+#FROM integers i1;
+% .%3 # table_name
+% %3 # name
+% int # type
+% 1 # length
+[ 1    ]
+[ 2    ]
+[ 3    ]
+[ NULL ]
+#SELECT
+#      (SELECT 1 FROM (VALUES (i1.i)) as i2(i))
+#FROM integers i1;
+% .%3 # table_name
+% %3 # name
+% tinyint # type
+% 1 # length
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
 #DROP FUNCTION evilfunction(INT);
 #DROP TABLE tbl_ProductSales;
 #DROP TABLE another_T;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to