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