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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list