Changeset: 1744e1646395 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1744e1646395
Modified Files:
        sql/server/rel_dump.c
Branch: Jun2020
Log Message:

Added missing properties and small bug fixes at rel_read


diffs (130 lines):

diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -1220,6 +1220,15 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        f = mark_notin;
                }
                break;
+       case 'e':
+               if (strncmp(r+*pos, "exists",  strlen("exists")) == 0) {
+                       (*pos)+= (int) strlen("exists");
+                       f = mark_exists;
+               } else if (strncmp(r+*pos, "!exists",  strlen("!exists")) == 0) 
{
+                       (*pos)+= (int) strlen("!exists");
+                       f = mark_notexists;
+               }
+               break;
        case 'n':
                if (strncmp(r+*pos, "notin",  strlen("notin")) == 0) {
                        (*pos)+= (int) strlen("notin");
@@ -1227,7 +1236,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                }
                break;
        case 'F':
-               if (strncmp(r+*pos, "FILTER",  strlen("FILTER")) == 0) {
+               if (strncasecmp(r+*pos, "FILTER",  strlen("FILTER")) == 0) {
                        (*pos)+= (int) strlen("FILTER");
                        f = cmp_filter;
                }
@@ -1349,7 +1358,7 @@ rel_read(mvc *sql, char *r, int *pos, li
 {
        sql_rel *rel = NULL, *nrel, *lrel, *rrel;
        list *exps, *gexps;
-       int distinct = 0;
+       int distinct = 0, dependent = 0, single = 0;
        operator_type j = op_basetable;
 
        skipWS(r,pos);
@@ -1489,11 +1498,22 @@ rel_read(mvc *sql, char *r, int *pos, li
                return rel_update(sql, lrel, rrel, NULL, nexps);
        }
 
-       if (r[*pos] == 'd') {
+       if (r[*pos] == 'd' && r[*pos+1] == 'i') {
                *pos += (int) strlen("distinct");
                skipWS(r, pos);
                distinct = 1;
        }
+       if (r[*pos] == 's' && r[*pos+1] == 'i') {
+               *pos += (int) strlen("single");
+               skipWS(r, pos);
+               single = 1;
+       }
+       if (r[*pos] == 'd' && r[*pos+1] == 'e') {
+               *pos += (int) strlen("dependent");
+               skipWS(r, pos);
+               dependent = 1;
+       }
+
        switch(r[*pos]) {
        case 't':
                if (r[*pos+1] == 'a') {
@@ -1656,15 +1676,17 @@ rel_read(mvc *sql, char *r, int *pos, li
                        rel = rel_select_copy(sql->sa, nrel, exps);
                        /* semijoin or antijoin */
                } else if (r[*pos+1] == 'e' || r[*pos+1] == 'n') {
-                       j = op_semi;
+                       if (r[*pos+1] == 'n') {
+                               j = op_anti;
+                               *pos += (int) strlen("antijoin");
+                       } else {
+                               j = op_semi;
+                               *pos += (int) strlen("semijoin");
+                       }
 
-                       if (r[*pos+1] == 'n')
-                               j = op_anti;
-
-                       *pos += (int) strlen("semijoin");
                        skipWS(r, pos);
                        if (r[*pos] != '(')
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Semijoin: missing '('\n");
+                               return sql_error(sql, -1, SQLSTATE(42000) "%s: 
missing '('\n", (j == op_semi)?"Semijoin":"Antijoin");
                        (*pos)++;
                        skipWS(r, pos);
                        if (!(lrel = rel_read(sql, r, pos, refs)))
@@ -1672,7 +1694,7 @@ rel_read(mvc *sql, char *r, int *pos, li
                        skipWS(r, pos);
 
                        if (r[*pos] != ',')
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Semijoin: missing ','\n");
+                               return sql_error(sql, -1, SQLSTATE(42000) "%s: 
missing ','\n", (j == op_semi)?"Semijoin":"Antijoin");
                        (*pos)++;
                        skipWS(r, pos);
                        if (!(rrel = rel_read(sql, r, pos, refs)))
@@ -1680,7 +1702,7 @@ rel_read(mvc *sql, char *r, int *pos, li
 
                        skipWS(r, pos);
                        if (r[*pos] != ')')
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Semijoin: missing ')'\n");
+                               return sql_error(sql, -1, SQLSTATE(42000) "%s: 
missing ')'\n", (j == op_semi)?"Semijoin":"Antijoin");
                        (*pos)++;
                        skipWS(r, pos);
 
@@ -1801,17 +1823,22 @@ rel_read(mvc *sql, char *r, int *pos, li
                if (r[*pos] == '[')
                        if (!(rel->r = read_exps(sql, NULL, rel, NULL, r, pos, 
'[', 0)))
                                return NULL;
-               if (distinct)
-                       set_distinct(rel);
-               distinct = 0;
                break;
        case 'd':
                /* 'ddl' not supported */
        default:
                return NULL;
        }
+
+       if (distinct)
+               set_distinct(rel);
+       if (single)
+               set_single(rel);
+       if (dependent)
+               set_dependent(rel);
+
        /* sometimes the properties are send */
-       while (strncmp(r+*pos, "REMOTE",  strlen("REMOTE")) == 0) { /* Remote 
tables under remote tables not supported, so remove REMOTE property */
+       while (strncmp(r+*pos, "REMOTE", strlen("REMOTE")) == 0) { /* Remote 
tables under remote tables not supported, so remove REMOTE property */
                (*pos)+= (int) strlen("REMOTE");
                skipWS(r, pos);
                skipUntilWS(r, pos);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to