Changeset: ba00c559f63c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ba00c559f63c
Modified Files:
        sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
        sql/benchmarks/tpch/LOCKED/Tests/14.stable.out
        sql/benchmarks/tpch/Tests/01-22.stable.out
        sql/benchmarks/tpch/Tests/14.stable.out
        sql/server/rel_bin.c
        sql/server/rel_optimizer.c
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        
sql/test/BugTracker-2009/Tests/arithmetic-small-values-null.SF-2921310.stable.out
        sql/test/BugTracker-2009/Tests/pow_operator.SF-2812721.sql
        
sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.err
        
sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.out
        sql/test/BugTracker-2012/Tests/power_priority.Bug-2291.stable.out
        
sql/test/BugTracker-2012/Tests/row_number_does_not_work_in_complex_query.Bug-2805.stable.out
        sql/test/mapi/Tests/php_monetdb.stable.out
Branch: default
Log Message:

fix operator precedence
^ no longer maps to power, but to binary xor
and ~ now maps to binery not.


diffs (truncated from 326 to 300 lines):

diff --git a/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out 
b/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
--- a/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
+++ b/sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out
@@ -479,7 +479,7 @@ Ready.
 % promo_revenue # name
 % decimal # type
 % 21 # length
-[ 15.48        ]
+[ 15.486545    ]
 #select * from optimizer_stats() stats;
 % .stats,      .stats # table_name
 % rewrite,     count # name
diff --git a/sql/benchmarks/tpch/LOCKED/Tests/14.stable.out 
b/sql/benchmarks/tpch/LOCKED/Tests/14.stable.out
--- a/sql/benchmarks/tpch/LOCKED/Tests/14.stable.out
+++ b/sql/benchmarks/tpch/LOCKED/Tests/14.stable.out
@@ -22,7 +22,7 @@ Ready.
 % promo_revenue # name
 % decimal # type
 % 21 # length
-[ 15.48        ]
+[ 15.486545    ]
 #select * from optimizer_stats() stats;
 % .stats,      .stats # table_name
 % rewrite,     count # name
diff --git a/sql/benchmarks/tpch/Tests/01-22.stable.out 
b/sql/benchmarks/tpch/Tests/01-22.stable.out
--- a/sql/benchmarks/tpch/Tests/01-22.stable.out
+++ b/sql/benchmarks/tpch/Tests/01-22.stable.out
@@ -479,7 +479,7 @@ Ready.
 % promo_revenue # name
 % decimal # type
 % 21 # length
-[ 15.48        ]
+[ 15.486545    ]
 #select * from optimizer_stats() stats;
 % .stats,      .stats # table_name
 % rewrite,     count # name
diff --git a/sql/benchmarks/tpch/Tests/14.stable.out 
b/sql/benchmarks/tpch/Tests/14.stable.out
--- a/sql/benchmarks/tpch/Tests/14.stable.out
+++ b/sql/benchmarks/tpch/Tests/14.stable.out
@@ -22,7 +22,7 @@ Ready.
 % promo_revenue # name
 % decimal # type
 % 21 # length
-[ 15.48        ]
+[ 15.486545    ]
 #select * from optimizer_stats() stats;
 % .stats,      .stats # table_name
 % rewrite,     count # name
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -1875,6 +1875,8 @@ rel2bin_union( mvc *sql, sql_rel *rel, l
        return sub;
 }
 
+/* Both EXCEPT and INTERSECT need work, current versions aren't mergetable 
save 
+ * (bails out on the gen_group) */
 static stmt *
 rel2bin_except( mvc *sql, sql_rel *rel, list *refs)
 {
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
@@ -3487,9 +3487,14 @@ exps_unique( list *exps )
 
        if ((n = exps->h) != NULL) {
                sql_exp *e = n->data;
-
-               if (e && find_prop(e->p, PROP_HASHCOL))
-                       return 1;
+               prop *p;
+
+               /* TODO, check if ukey is complete */
+               if (e && (p = find_prop(e->p, PROP_HASHCOL)) != NULL) {
+                       sql_ukey *k = p->value;
+                       if (list_length(k->k.columns) <= 1)
+                               return 1;
+               }
        }
        return 0;
 }
@@ -3497,6 +3502,10 @@ exps_unique( list *exps )
 static sql_rel *
 rel_push_project_down_union(int *changes, mvc *sql, sql_rel *rel) 
 {
+       /* first remove distinct if allready unique */
+       if (rel->op == op_project && need_distinct(rel) && rel->exps && 
exps_unique(rel->exps))
+               set_nodistinct(rel);
+
        if (rel->op == op_project && rel->l && rel->exps && !rel->r && 
!project_unsafe(rel)) {
                int need_distinct = need_distinct(rel);
                sql_rel *u = rel->l;
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -462,7 +462,7 @@ int yydebug=1;
 %token <sval>
        IDENT aTYPE ALIAS AGGR AGGR2 RANK sqlINT HEXADECIMAL INTNUM APPROXNUM 
        USING 
-       ALL ANY SOME GLOBAL CAST CONVERT
+       GLOBAL CAST CONVERT
        CHARACTER VARYING LARGE OBJECT VARCHAR CLOB sqlTEXT BINARY sqlBLOB
        sqlDECIMAL sqlFLOAT
        TINYINT SMALLINT BIGINT sqlINTEGER
@@ -480,8 +480,7 @@ int yydebug=1;
 %token  UNCOMMITTED COMMITTED sqlREPEATABLE SERIALIZABLE DIAGNOSTICS sqlSIZE
 
 %token <sval> ASYMMETRIC SYMMETRIC ORDER BY
-%token <sval> LIKE ILIKE BETWEEN
-%token <operation> sqlIN EXISTS ESCAPE HAVING sqlGROUP sqlNULL
+%token <operation> EXISTS ESCAPE HAVING sqlGROUP sqlNULL
 %token <operation> FROM FOR MATCH
 
 %token <operation> EXTRACT
@@ -508,20 +507,19 @@ int yydebug=1;
 /* operators */
 %left UNION EXCEPT INTERSECT CORRESPONDING UNIONJOIN
 %left JOIN CROSS LEFT FULL RIGHT INNER NATURAL
-%left LIKE BETWEEN sqlIN WITH DATA
-%left <operation> OR
+%left WITH DATA
+%left <operation> '(' ')'
+%left <sval> FILTER_FUNC 
+
+%left <operation> '='
+%left <operation> ALL ANY BETWEEN sqlIN LIKE ILIKE OR SOME
 %left <operation> AND
 %left <operation> NOT
-%left <operation> '(' ')'
 %left <sval> COMPARISON /* <> < > <= >= */
-%left <sval> FILTER_FUNC 
-%left <operation> '='
-%left <operation> '&' '|' '^' LEFT_SHIFT RIGHT_SHIFT
-%left <operation> '+' '-'
-%left <operation> '*'
-%left <operation> '/' '%' 
-%left <operation> SUBSTRING CONCATSTRING POSITION
+%left <operation> '+' '-' '&' '|' '^' LEFT_SHIFT RIGHT_SHIFT CONCATSTRING 
SUBSTRING POSITION
 %right UMINUS
+%left <operation> '*' '/' '%'
+%left <operation> '~'
 
        /* literal keyword tokens */
 /*
@@ -3350,7 +3348,7 @@ simple_scalar_exp:
  |  scalar_exp '^' scalar_exp
                        { dlist *l = L();
                          append_list(l, 
-                               append_string(L(), sa_strdup(SA, "power")));
+                               append_string(L(), sa_strdup(SA, "bit_xor")));
                          append_symbol(l, $1);
                          append_symbol(l, $3);
                          $$ = _symbol_create_list( SQL_BINOP, l ); }
@@ -3368,6 +3366,12 @@ simple_scalar_exp:
                          append_symbol(l, $1);
                          append_symbol(l, $3);
                          $$ = _symbol_create_list( SQL_BINOP, l ); }
+ |  '~' scalar_exp
+                       { dlist *l = L();
+                         append_list(l, 
+                               append_string(L(), sa_strdup(SA, "bit_not")));
+                         append_symbol(l, $2);
+                         $$ = _symbol_create_list( SQL_BINOP, l ); }
  |  scalar_exp LEFT_SHIFT scalar_exp
                        { dlist *l = L();
                          append_list(l, 
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -802,12 +802,13 @@ int scanner_symbol(mvc * c, int cur)
                lc->started = 1;
                utf8_putchar(lc, next); 
                return scanner_token(lc, cur);
+       case '~': /* binary not */
+       case '^': /* binary xor */
+       case '&': /* binary and */
        case '*':
        case '?':
        case '%':
-       case '^':
        case '+':
-       case '&':
        case '(':
        case ')':
        case ',':
@@ -857,7 +858,7 @@ int scanner_symbol(mvc * c, int cur)
                        cur = '.';
                        return number(c, cur);
                }
-       case '|':
+       case '|': /* binary or or string concat */
                lc->started = 1;
                cur = scanner_getc(lc);
                if (cur == '|') {
diff --git 
a/sql/test/BugTracker-2009/Tests/arithmetic-small-values-null.SF-2921310.stable.out
 
b/sql/test/BugTracker-2009/Tests/arithmetic-small-values-null.SF-2921310.stable.out
--- 
a/sql/test/BugTracker-2009/Tests/arithmetic-small-values-null.SF-2921310.stable.out
+++ 
b/sql/test/BugTracker-2009/Tests/arithmetic-small-values-null.SF-2921310.stable.out
@@ -27,15 +27,15 @@ Ready.
 #select (4.4054292 - 4.40572025343667)^2 + (52.0903881 - 52.091375762174)^2;
 % . # table_name
 % sql_sub_single_value # name
-% double # type
-% 24 # length
-[ 1.060188673e-06      ]
+% decimal # type
+% 21 # length
+[ -3.99941117029739    ]
 #select cast((4.4054292 - 4.40572025343667)^2 as double) + cast((52.0903881 - 
52.091375762174)^2 as double);
 % . # table_name
 % sql_sub_single_value # name
 % double # type
 % 24 # length
-[ 1.060188673e-06      ]
+[ -3.99941117  ]
 
 # 15:12:22 >  
 # 15:12:22 >  Done.
diff --git a/sql/test/BugTracker-2009/Tests/pow_operator.SF-2812721.sql 
b/sql/test/BugTracker-2009/Tests/pow_operator.SF-2812721.sql
--- a/sql/test/BugTracker-2009/Tests/pow_operator.SF-2812721.sql
+++ b/sql/test/BugTracker-2009/Tests/pow_operator.SF-2812721.sql
@@ -1,2 +1,2 @@
-select 2 ^ 2;
-select 2.8 ^ 2;
+select power(2,2);
+select power(2.8,2);
diff --git 
a/sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.err
 
b/sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.err
--- 
a/sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.err
+++ 
b/sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.err
@@ -27,9 +27,15 @@ stderr of test 'now_results_in_illegal_a
 # 12:53:46 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=budapest" 
"--port=36456"
 # 12:53:46 >  
 
-MAPI  = monetdb@budapest:36456
+MAPI  = monetdb@niels:37920
 QUERY = select now() + 1;
 ERROR = !illegal argument
+MAPI  = monetdb@niels:37920
+QUERY = select now() + interval '1' second - now();
+ERROR = !SELECT: no such binary operator 'sql_sub(timestamptz,timestamptz)'
+MAPI  = monetdb@niels:37920
+QUERY = select now() - now();
+ERROR = !SELECT: no such binary operator 'sql_sub(timestamptz,timestamptz)'
 
 # 12:53:46 >  
 # 12:53:46 >  "Done."
diff --git 
a/sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.out
 
b/sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.out
--- 
a/sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.out
+++ 
b/sql/test/BugTracker-2012/Tests/now_results_in_illegal_argument.Bug-2978.stable.out
@@ -47,8 +47,6 @@ Ready.
 # 12:53:46 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=budapest" 
"--port=36456"
 # 12:53:46 >  
 
-1 second #expected output of 2nd query
-0      #expected ouput of 3rd query
 
 # 12:53:46 >  
 # 12:53:46 >  "Done."
diff --git a/sql/test/BugTracker-2012/Tests/power_priority.Bug-2291.stable.out 
b/sql/test/BugTracker-2012/Tests/power_priority.Bug-2291.stable.out
--- a/sql/test/BugTracker-2012/Tests/power_priority.Bug-2291.stable.out
+++ b/sql/test/BugTracker-2012/Tests/power_priority.Bug-2291.stable.out
@@ -49,9 +49,9 @@ Ready.
 #select (4.4054292 - 4.40572025343667)^2 + (52.0903881 - 52.091375762174)^2;
 % . # table_name
 % sql_sub_single_value # name
-% double # type
-% 24 # length
-[ 1.060188673e-06   ]
+% decimal # type
+% 21 # length
+[ -0.00076334574955    ]
 
 # 15:05:38 >  
 # 15:05:38 >  "Done."
diff --git 
a/sql/test/BugTracker-2012/Tests/row_number_does_not_work_in_complex_query.Bug-2805.stable.out
 
b/sql/test/BugTracker-2012/Tests/row_number_does_not_work_in_complex_query.Bug-2805.stable.out
--- 
a/sql/test/BugTracker-2012/Tests/row_number_does_not_work_in_complex_query.Bug-2805.stable.out
+++ 
b/sql/test/BugTracker-2012/Tests/row_number_does_not_work_in_complex_query.Bug-2805.stable.out
@@ -254,7 +254,7 @@ Ready.
 [ 1    ]
 #with Raw as (select a,b,c,count(*) as value from  T where e<10 and c<50 group 
by a,b,c) select Raw.*, row_number() over (partition by a order by value desc) 
from Raw;
 % sys.raw,     sys.raw,        sys.raw,        sys.raw,        . # table_name
-% a,   b,      c,      value,  row_number_a # name
+% a,   b,      c,      value,  row_number_value # name
 % int, int,    int,    wrd,    int # type
 % 1,   1,      1,      1,      1 # length
 [ 7,   7,      7,      1,      1       ]
diff --git a/sql/test/mapi/Tests/php_monetdb.stable.out 
b/sql/test/mapi/Tests/php_monetdb.stable.out
--- a/sql/test/mapi/Tests/php_monetdb.stable.out
+++ b/sql/test/mapi/Tests/php_monetdb.stable.out
@@ -81,21 +81,21 @@ 2123        keys    2102            0       true    2       
false   0
 2130   idxs    2102            0       true    2       false   0       
 2135   triggers        2102            0       true    2       false   0       
 2146   objects 2102            0       true    2       false   0       
-5018   tables  2000    SELECT * FROM (SELECT p.*, 0 AS "temporary" FROM 
"sys"."_tables" AS p UNION ALL SELECT t.*, 1 AS "temporary" FROM 
"tmp"."_tables" AS t) AS tables where tables.type < 2;        1       true    0 
      false   0       
-5028   columns 2000    SELECT * FROM (SELECT p.* FROM "sys"."_columns" AS p 
UNION ALL SELECT t.* FROM "tmp"."_columns" AS t) AS columns;       1       true 
   0       false   0       
-5048   db_user_info    2000            0       true    0       false   0       
-5056   users   2000    SELECT u."name" AS "name", ui."fullname", 
ui."default_schema" FROM db_users() AS u LEFT JOIN "sys"."db_user_info" AS ui 
ON u."name" = ui."name" ;       1       true    0       false   0       
-5060   user_role       2000            0       true    0       false   0       
-5063   auths   2000            0       true    0       false   0       
-5067   privileges      2000            0       true    0       false   0       
-5220   queryhistory    2000            0       true    0       false   0       
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to