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

Handle rel_read for insert, update, delete and truncate relations. Also handle 
list of values expressions (e_atom with e->f).


diffs (272 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
@@ -14,6 +14,7 @@
 #include "rel_rel.h"
 #include "rel_exp.h"
 #include "rel_prop.h"
+#include "rel_updates.h"
 #include "rel_remote.h"
 #include "mal_errors.h"                /* for SQLSTATE() */
 
@@ -720,7 +721,7 @@ read_prop( mvc *sql, sql_exp *exp, char 
                skipIdent(r,pos);
                old = r[*pos];
                r[*pos] = 0;
-               
+
                s = mvc_bind_schema(sql, sname);
                if (!find_prop(exp->p, PROP_JOINIDX)) {
                        p = exp->p = prop_create(sql->sa, PROP_JOINIDX, exp->p);
@@ -781,10 +782,9 @@ read_exps(mvc *sql, sql_rel *lrel, sql_r
 }
 
 static sql_exp*
-exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *pexps, char *r, int 
*pos, int grp) 
+exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *pexps, char *r, int 
*pos, int grp)
 {
-       int f = -1;
-       int not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0;
+       int f = -1, not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0;
        char *tname, *cname = NULL, *e, *b = r + *pos, *st;
        sql_exp *exp = NULL;
        list *exps = NULL;
@@ -805,7 +805,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                e = r+*pos - quote;
                old = *e;
                *e = 0;
-               
+
                tname = sa_strdup(sql->sa, tname);
                cname = sa_strdup(sql->sa, cname);
                *e = old;
@@ -829,7 +829,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        int filter = 0, anti = 0;
                        list *lexps,*rexps;
                        char *fname = NULL;
-                      
+
                        lexps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 
0);
                        skipWS(r, pos);
                        if (r[*pos] == '!') {
@@ -861,50 +861,57 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                sql_subfunc *func = sql_find_func(sql->sa, 
mvc_bind_schema(sql, "sys"), fname, 1+list_length(exps), F_FILT, NULL);
                                if (!func)
                                        return sql_error(sql, -1, 
SQLSTATE(42000) "Filter: missing function '%s'\n", fname);
-                                       
+
                                return exp_filter(sql->sa, lexps, rexps, func, 
anti);
                        }
                        return exp_or(sql->sa, lexps, rexps, anti);
                }
                /* fall through */
-       case '[': 
-               old = *e;
-               *e = 0;
+       case '[':
                tname = b;
-               if (old != '[') {
-                       (*pos)++;
-                       d = readInt(r,pos);
-                       if (r[*pos] != ')' && r[*pos] != ',')
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Type: missing ')' or ','\n");
-                       if (r[*pos] == ',') {
+               if (tname && *tname == '[') { /* list of values */
+                       exps = read_exps(sql, lrel, rrel, pexps, r, pos, '[', 
0);
+                       if (!exps)
+                               return NULL;
+                       exp = exp_values(sql->sa, exps);
+               } else {
+                       old = *e;
+                       *e = 0;
+                       if (old != '[') {
                                (*pos)++;
-                               s = readInt(r,pos);
+                               d = readInt(r,pos);
+                               if (r[*pos] != ')' && r[*pos] != ',')
+                                       return sql_error(sql, -1, 
SQLSTATE(42000) "Type: missing ')' or ','\n");
+                               if (r[*pos] == ',') {
+                                       (*pos)++;
+                                       s = readInt(r,pos);
+                               }
+                               if (r[*pos] != ')')
+                                       return sql_error(sql, -1, 
SQLSTATE(42000) "Type: missing ')'\n");
+                               (*pos)++;
                        }
-                       if (r[*pos] != ')') 
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Type: missing ')'\n");
-                       (*pos)++;
-               }
-               tpe = sql_bind_subtype(sql->sa, tname, d, s);
-               skipWS(r, pos);
-               *e = old;
-               if (r[*pos] == '[') { /* convert */
-                       (*pos)++;
+                       tpe = sql_bind_subtype(sql->sa, tname, d, s);
                        skipWS(r, pos);
-                       exp = exp_read(sql, lrel, rrel, pexps, r, pos, 0);
-                       if (!exp)
-                               return NULL;
-                       if (r[*pos] != ']') 
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Convert: missing ']'\n");
-                       (*pos)++;
-                       skipWS(r, pos);
-                       exp = exp_convert(sql->sa, exp, exp_subtype(exp), tpe);
-               } else {
-                       st = readString(r,pos);
-                       if (st && strcmp(st, "NULL") == 0)
-                               exp = exp_atom(sql->sa, atom_general(sql->sa, 
tpe, NULL));
-                       else
-                               exp = exp_atom(sql->sa, atom_general(sql->sa, 
tpe, st));
-                       skipWS(r, pos);
+                       *e = old;
+                       if (r[*pos] == '[') { /* convert */
+                               (*pos)++;
+                               skipWS(r, pos);
+                               exp = exp_read(sql, lrel, rrel, pexps, r, pos, 
0);
+                               if (!exp)
+                                       return NULL;
+                               if (r[*pos] != ']')
+                                       return sql_error(sql, -1, 
SQLSTATE(42000) "Convert: missing ']'\n");
+                               (*pos)++;
+                               skipWS(r, pos);
+                               exp = exp_convert(sql->sa, exp, 
exp_subtype(exp), tpe);
+                       } else {
+                               st = readString(r,pos);
+                               if (st && strcmp(st, "NULL") == 0)
+                                       exp = exp_atom(sql->sa, 
atom_general(sql->sa, tpe, NULL));
+                               else
+                                       exp = exp_atom(sql->sa, 
atom_general(sql->sa, tpe, st));
+                               skipWS(r, pos);
+                       }
                }
                break;
        case '\"': 
@@ -964,13 +971,13 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        if (f && f->func->fix_scale == SCALE_MUL && 
list_length(exps) == 2) {
                                sql_arg *ares = f->func->res->h->data;
 
-                               if (strcmp(f->func->imp, "*") == 0 && 
ares->type.type->scale == SCALE_FIX) {
-                                       sql_subtype *res = f->res->h->data;
+                       if (strcmp(f->func->imp, "*") == 0 && 
ares->type.type->scale == SCALE_FIX) {
+                                       sql_subtype *res = f->res->h->data;
                                        sql_subtype *lt = ops->h->data;
                                        sql_subtype *rt = ops->h->next->data;
 
                                        res->digits = lt->digits;
-                                       res->scale = lt->scale + rt->scale;
+                                       res->scale = lt->scale + rt->scale;
                                }
                        }
 
@@ -1155,15 +1162,11 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
        if (f >= 0) {
                skipWS(r,pos);
                if (f == cmp_in || f == cmp_notin) {
-                       list *exps;
-                      
-                       exps = read_exps(sql, lrel, rrel, pexps, r, pos, '(', 
0);
+                       list *exps = read_exps(sql, lrel, rrel, pexps, r, pos, 
'(', 0);
                        if (f == cmp_in || f == cmp_notin)
                                return exp_in(sql->sa, exp, exps, f);
                } else {
-                       sql_exp *e;
-
-                       e = exp_read(sql, lrel, rrel, pexps, r, pos, 0);
+                       sql_exp *e = exp_read(sql, lrel, rrel, pexps, r, pos, 
0);
                        if (e && e->type == e_cmp) {
                                sql_exp *ne = exp_compare2(sql->sa, e->l, exp, 
e->r, compare2range(swap_compare((comp_type)f), e->flag));
                                if (is_anti(exp))
@@ -1205,6 +1208,60 @@ rel_read(mvc *sql, char *r, int *pos, li
        operator_type j = op_basetable;
 
        skipWS(r,pos);
+
+       if (r[*pos] == 'i' && r[*pos+1] == 'n' && r[*pos+2] == 's') {
+               *pos += (int) strlen("insert");
+               skipWS(r, pos);
+               (*pos)++; /* ( */
+               lrel = rel_read(sql, r, pos, refs); /* to be inserted relation 
*/
+               skipWS(r,pos);
+               rrel = rel_read(sql, r, pos, refs); /* the inserts relation */
+               skipWS(r,pos);
+               (*pos)++; /* ) */
+
+               return rel_insert(sql, lrel, rrel);
+       }
+
+       if (r[*pos] == 'd' && r[*pos+1] == 'e' && r[*pos+2] == 'l') {
+               *pos += (int) strlen("delete");
+               skipWS(r, pos);
+               (*pos)++; /* ( */
+               lrel = rel_read(sql, r, pos, refs); /* to be deleted relation */
+               skipWS(r,pos);
+               rrel = rel_read(sql, r, pos, refs); /* the deletes relation */
+               skipWS(r,pos);
+               (*pos)++; /* ) */
+
+               return rel_delete(sql->sa, lrel, rrel);
+       }
+
+       if (r[*pos] == 't' && r[*pos+1] == 'r' && r[*pos+2] == 'u') {
+               *pos += (int) strlen("truncate");
+               skipWS(r, pos);
+               (*pos)++; /* ( */
+               lrel = rel_read(sql, r, pos, refs); /* to be truncated relation 
*/
+               skipWS(r,pos);
+               (*pos)++; /* ) */
+
+               return rel_truncate(sql->sa, lrel, 0, 0);
+       }
+
+       if (r[*pos] == 'u' && r[*pos+1] == 'p' && r[*pos+2] == 'd') {
+               *pos += (int) strlen("update");
+               skipWS(r, pos);
+               (*pos)++; /* ( */
+               lrel = rel_read(sql, r, pos, refs); /* to be updated relation */
+               skipWS(r,pos);
+               rrel = rel_read(sql, r, pos, refs); /* the updates relation */
+               skipWS(r,pos);
+               (*pos)++; /* ) */
+
+               exps = read_exps(sql, lrel, rrel, NULL, r, pos, '[', 0); /* 
columns to be updated */
+               if (!exps)
+                       return NULL;
+               return rel_update(sql, lrel, rrel, NULL, exps);
+       }
+
        if (r[*pos] == 'R') {
                *pos += (int) strlen("REF");
 
@@ -1266,10 +1323,10 @@ rel_read(mvc *sql, char *r, int *pos, li
                        if (!s || !t)
                                return sql_error(sql, -1, SQLSTATE(42000) 
"Table: missing '%s.%s'\n", sname, tname);
                        rel = rel_basetable(sql, t, tname);
-               
+
                        if (!r[*pos])
                                return rel;
-       
+
                        /* scan aliases */
                        exps = read_exps(sql, rel, NULL, NULL, r, pos, '[', 0);
                        if (exps && list_length(exps))
@@ -1506,6 +1563,18 @@ rel_read(mvc *sql, char *r, int *pos, li
                        return NULL;
                set_processed(rel);
                break;
+       case '[': /* projection of list of values */
+               exps = read_exps(sql, NULL, NULL, NULL, r, pos, '[', 0);
+               if (!exps)
+                       return NULL;
+               rel = rel_project(sql->sa, NULL, exps);
+               /* order by ? */
+               if (r[*pos] == '[')
+                       rel->r = read_exps(sql, NULL, rel, NULL, r, pos, '[', 
0);
+               if (distinct)
+                       set_distinct(rel);
+               distinct = 0;
+               break;
        case 'd':
                /* 'ddl' not supported */
        default:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to