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

Backported changeset 153a0dd56097 partially


diffs (291 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
@@ -789,8 +789,8 @@ readString( char *r, int *pos)
 
 static sql_exp* exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list 
*top_exps, char *r, int *pos, int grp) ;
 
-static void *
-read_prop( mvc *sql, sql_exp *exp, char *r, int *pos)
+static sql_exp*
+read_prop(mvc *sql, sql_exp *exp, char *r, int *pos, bool *found)
 {
        /* PROPs */
        if (strncmp(r+*pos, "JOINIDX",  strlen("JOINIDX")) == 0) {
@@ -828,6 +828,8 @@ read_prop( mvc *sql, sql_exp *exp, char 
                                return sql_error(sql, -1, SQLSTATE(42000) 
"Index %s missing\n", iname);
                }
                skipWS(r,pos);
+               if (found)
+                       *found = true;
        }
        return exp;
 }
@@ -854,7 +856,7 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
                }
                append(exps, e);
                skipWS( r, pos);
-               if (!read_prop(sql, e, r, pos))
+               if (!read_prop(sql, e, r, pos, NULL))
                        return NULL;
                while (r[*pos] == ',') {
 
@@ -865,7 +867,7 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
                                return NULL;
                        append(exps, e);
                        skipWS( r, pos);
-                       if (!read_prop(sql, e, r, pos))
+                       if (!read_prop(sql, e, r, pos, NULL))
                                return NULL;
                }
                if (r[*pos] != ebracket)
@@ -877,6 +879,48 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
 }
 
 static sql_exp*
+read_exp_properties(mvc *sql, sql_exp *exp, char *r, int *pos)
+{
+       bool found = true;
+       while (found) {
+               found = false;
+
+               if (strncmp(r+*pos, "COUNT",  strlen("COUNT")) == 0) {
+                       (*pos)+= (int) strlen("COUNT");
+                       skipWS(r,pos);
+                       found = true;
+               } else if (strncmp(r+*pos, "HASHIDX",  strlen("HASHIDX")) == 0) 
{
+                       (*pos)+= (int) strlen("HASHIDX");
+                       if (!find_prop(exp->p, PROP_HASHIDX))
+                               exp->p = prop_create(sql->sa, PROP_HASHIDX, 
exp->p);
+                       skipWS(r,pos);
+                       found = true;
+               } else if (strncmp(r+*pos, "SORTIDX",  strlen("SORTIDX")) == 0) 
{
+                       (*pos)+= (int) strlen("SORTIDX");
+                       if (!find_prop(exp->p, PROP_SORTIDX))
+                               exp->p = prop_create(sql->sa, PROP_SORTIDX, 
exp->p);
+                       skipWS(r,pos);
+                       found = true;
+               } else if (strncmp(r+*pos, "HASHCOL",  strlen("HASHCOL")) == 0) 
{
+                       (*pos)+= (int) strlen("HASHCOL");
+                       if (!find_prop(exp->p, PROP_HASHCOL))
+                               exp->p = prop_create(sql->sa, PROP_HASHCOL, 
exp->p);
+                       skipWS(r,pos);
+                       found = true;
+               } else if (strncmp(r+*pos, "FETCH",  strlen("FETCH")) == 0) {
+                       (*pos)+= (int) strlen("FETCH");
+                       if (!find_prop(exp->p, PROP_FETCH))
+                               exp->p = prop_create(sql->sa, PROP_FETCH, 
exp->p);
+                       skipWS(r,pos);
+                       found = true;
+               }
+               if (!read_prop(sql, exp, r, pos, &found))
+                       return NULL;
+       }
+       return exp;
+}
+
+static sql_exp*
 exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *top_exps, char *r, int 
*pos, int grp)
 {
        int f = -1, not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0, 
zero_if_empty = 0;
@@ -1204,10 +1248,17 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                skipWS(r, pos);
                set_semantics(exp);
        }
-       /* [ COUNT ] */
-       if (strncmp(r+*pos, "COUNT",  strlen("COUNT")) == 0) {
-               (*pos)+= (int) strlen("COUNT");
-               skipWS( r, pos);
+
+       /* [ ANY|ALL ] */
+       if (strncmp(r+*pos, "ANY",  strlen("ANY")) == 0) {
+               (*pos)+= (int) strlen("ANY");
+               skipWS(r, pos);
+               exp->flag = 1;
+       }
+       if (strncmp(r+*pos, "ALL",  strlen("ALL")) == 0) {
+               (*pos)+= (int) strlen("ALL");
+               skipWS(r, pos);
+               exp->flag = 2;
        }
        /* [ ASC ] */
        if (strncmp(r+*pos, "ASC",  strlen("ASC")) == 0) {
@@ -1221,17 +1272,6 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                skipWS(r, pos);
                set_nulls_last(exp);
        }
-       /* [ ANY|ALL ] */
-       if (strncmp(r+*pos, "ANY",  strlen("ANY")) == 0) {
-               (*pos)+= (int) strlen("ANY");
-               skipWS(r, pos);
-               exp->flag = 1;
-       }
-       if (strncmp(r+*pos, "ALL",  strlen("ALL")) == 0) {
-               (*pos)+= (int) strlen("ALL");
-               skipWS(r, pos);
-               exp->flag = 2;
-       }
        /* [ NOT ] NULL */
        if (strncmp(r+*pos, "NOT",  strlen("NOT")) == 0) {
                (*pos)+= (int) strlen("NOT");
@@ -1244,25 +1284,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                if (not)
                        set_has_no_nil(exp);
        }
-       if (strncmp(r+*pos, "HASHIDX",  strlen("HASHIDX")) == 0) {
-               (*pos)+= (int) strlen("HASHIDX");
-               if (!find_prop(exp->p, PROP_HASHIDX))
-                       exp->p = prop_create(sql->sa, PROP_HASHIDX, exp->p);
-               skipWS(r,pos);
-       }
-       if (strncmp(r+*pos, "HASHCOL",  strlen("HASHCOL")) == 0) {
-               (*pos)+= (int) strlen("HASHCOL");
-               if (!find_prop(exp->p, PROP_HASHCOL))
-                       exp->p = prop_create(sql->sa, PROP_HASHCOL, exp->p);
-               skipWS(r,pos);
-       }
-       if (strncmp(r+*pos, "FETCH",  strlen("FETCH")) == 0) {
-               (*pos)+= (int) strlen("FETCH");
-               if (!find_prop(exp->p, PROP_FETCH))
-                       exp->p = prop_create(sql->sa, PROP_FETCH, exp->p);
-               skipWS(r,pos);
-       }
-       if (!read_prop(sql, exp, r, pos))
+
+       if (!(exp = read_exp_properties(sql, exp, r, pos)))
                return NULL;
        skipWS(r,pos);
 
@@ -1424,6 +1447,46 @@ rel_set_types(mvc *sql, sql_rel *rel)
        return 0;
 }
 
+static sql_rel*
+read_rel_properties(mvc *sql, sql_rel *rel, char *r, int *pos)
+{
+       bool found = true;
+       while (found) {
+               found = false;
+
+               if (strncmp(r+*pos, "COUNT",  strlen("COUNT")) == 0) {
+                       (*pos)+= (int) strlen("COUNT");
+                       skipWS(r,pos);
+                       found = true;
+               } else if (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);
+                       skipWS(r, pos);
+                       found = true;
+               } else if (strncmp(r+*pos, "USED", strlen("USED")) == 0) {
+                       (*pos)+= (int) strlen("USED");
+                       if (!find_prop(rel->p, PROP_USED))
+                               rel->p = prop_create(sql->sa, PROP_USED, 
rel->p);
+                       skipWS(r, pos);
+                       found = true;
+               } else if (strncmp(r+*pos, "DISTRIBUTE", strlen("DISTRIBUTE")) 
== 0) {
+                       (*pos)+= (int) strlen("DISTRIBUTE");
+                       if (!find_prop(rel->p, PROP_DISTRIBUTE))
+                               rel->p = prop_create(sql->sa, PROP_DISTRIBUTE, 
rel->p);
+                       skipWS(r, pos);
+                       found = true;
+               } else if (strncmp(r+*pos, "GROUPINGS", strlen("GROUPINGS")) == 
0) {
+                       (*pos)+= (int) strlen("GROUPINGS");
+                       if (!find_prop(rel->p, PROP_GROUPINGS))
+                               rel->p = prop_create(sql->sa, PROP_GROUPINGS, 
rel->p);
+                       skipWS(r, pos);
+                       found = true;
+               }
+       }
+       return rel;
+}
+
 sql_rel*
 rel_read(mvc *sql, char *r, int *pos, list *refs)
 {
@@ -1474,7 +1537,9 @@ rel_read(mvc *sql, char *r, int *pos, li
                t = get_table(lrel);
                if (!insert_allowed(sql, t, t->base.name, "INSERT", "insert"))
                        return NULL;
-               return rel_insert(sql, lrel, rrel);
+
+               if (!(rel = rel_insert(sql, lrel, rrel)) || !(rel = 
read_rel_properties(sql, rel, r, pos)))
+                       return NULL;
        }
 
        if (r[*pos] == 'd' && r[*pos+1] == 'e' && r[*pos+2] == 'l') {
@@ -1495,7 +1560,8 @@ rel_read(mvc *sql, char *r, int *pos, li
                if (!update_allowed(sql, t, t->base.name, "DELETE", "delete", 
1))
                        return NULL;
 
-               return rel_delete(sql->sa, lrel, rrel);
+               if (!(rel = rel_delete(sql->sa, lrel, rrel)) || !(rel = 
read_rel_properties(sql, rel, r, pos)))
+                       return NULL;
        }
 
        if (r[*pos] == 't' && r[*pos+1] == 'r' && r[*pos+2] == 'u') {
@@ -1526,7 +1592,8 @@ rel_read(mvc *sql, char *r, int *pos, li
                if (!update_allowed(sql, t, t->base.name, "TRUNCATE", 
"truncate", 2))
                        return NULL;
 
-               return rel_truncate(sql->sa, lrel, restart_sequences, 
drop_action);
+               if (!(rel = rel_truncate(sql->sa, lrel, restart_sequences, 
drop_action)) || !(rel = read_rel_properties(sql, rel, r, pos)))
+                       return NULL;
        }
 
        if (r[*pos] == 'u' && r[*pos+1] == 'p' && r[*pos+2] == 'd') {
@@ -1566,7 +1633,8 @@ rel_read(mvc *sql, char *r, int *pos, li
                        list_append(nexps, e);
                }
 
-               return rel_update(sql, lrel, rrel, NULL, nexps);
+               if (!(rel = rel_update(sql, lrel, rrel, NULL, nexps)) || !(rel 
= read_rel_properties(sql, rel, r, pos)))
+                       return NULL;
        }
 
        if (r[*pos] == 'd' && r[*pos+1] == 'i') {
@@ -1728,10 +1796,6 @@ rel_read(mvc *sql, char *r, int *pos, li
                                        return NULL;
                                rel->exps = exps;
                        }
-                       if (strncmp(r+*pos, "COUNT",  strlen("COUNT")) == 0) {
-                               (*pos)+= (int) strlen("COUNT");
-                               skipWS( r, pos);
-                       }
                } else { /* top N */
                        *pos += (int) strlen("top N");
                        skipWS(r, pos);
@@ -2000,30 +2064,8 @@ rel_read(mvc *sql, char *r, int *pos, li
        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 */
-               (*pos)+= (int) strlen("REMOTE");
-               skipWS(r, pos);
-               skipUntilWS(r, pos);
-               skipWS(r, pos);
-       }
-       while (strncmp(r+*pos, "USED", strlen("USED")) == 0) {
-               (*pos)+= (int) strlen("USED");
-               if (!find_prop(rel->p, PROP_USED))
-                       rel->p = prop_create(sql->sa, PROP_USED, rel->p);
-               skipWS(r, pos);
-       }
-       while (strncmp(r+*pos, "DISTRIBUTE", strlen("DISTRIBUTE")) == 0) {
-               (*pos)+= (int) strlen("DISTRIBUTE");
-               if (!find_prop(rel->p, PROP_DISTRIBUTE))
-                       rel->p = prop_create(sql->sa, PROP_DISTRIBUTE, rel->p);
-               skipWS(r, pos);
-       }
-       while (strncmp(r+*pos, "GROUPINGS", strlen("GROUPINGS")) == 0) {
-               (*pos)+= (int) strlen("GROUPINGS");
-               if (!find_prop(rel->p, PROP_GROUPINGS))
-                       rel->p = prop_create(sql->sa, PROP_GROUPINGS, rel->p);
-               skipWS(r, pos);
-       }
+       /* sometimes, properties are sent */
+       if (!(rel = read_rel_properties(sql, rel, r, pos)))
+               return NULL;
        return rel;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to