Changeset: 6e2ff480cd1a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6e2ff480cd1a
Modified Files:
        sql/server/sqlparse.c
Branch: clean_parser
Log Message:

handle some more sql syntax..


diffs (121 lines):

diff --git a/sql/server/sqlparse.c b/sql/server/sqlparse.c
--- a/sql/server/sqlparse.c
+++ b/sql/server/sqlparse.c
@@ -157,27 +157,46 @@ qname_schema_object(dlist *qname)
 
 
 static char * sp_symbol2string(mvc *sql, symbol *se, int expression, char 
**err);
+static char * dlist2string(mvc *sql, dlist *l, char *sep, int expression, char 
**err);
 
 static char *
-dlist2string(mvc *sql, dlist *l, int expression, char **err)
+dnode2string(mvc *sql, dnode *n, int expression, char **err)
 {
+       char *s = NULL;
+       if (n->type == type_string) {
+               if (n->data.sval)
+                       s = sa_strdup(sql->ta, n->data.sval);
+               else
+                       s = "";
+       } else if (n->type == type_int) {
+               char buf[10];
+               snprintf(buf, sizeof(buf), "%d", n->data.i_val);
+               s = sa_strdup(sql->ta, buf);
+       } else if (n->type == type_symbol) {
+               s = sp_symbol2string(sql, n->data.sym, expression, err);
+       } else if (n->type == type_list) {
+               s = dlist2string(sql, n->data.lval, ", ", expression, err);
+       }
+       return s;
+}
+
+static char *
+dlist2string(mvc *sql, dlist *l, char *sep, int expression, char **err)
+{
+       if (!l)
+               return " EMPTY_LIST ";
        char *b = NULL;
        dnode *n;
 
        for (n=l->h; n; n = n->next) {
-               char *s = NULL;
-
-               if (n->type == type_string && n->data.sval)
-                       s = sa_strdup(sql->ta, n->data.sval);
-               else if (n->type == type_symbol)
-                       s = sp_symbol2string(sql, n->data.sym, expression, err);
+               char *s = dnode2string(sql, n, expression, err);
 
                if (!s)
                        return NULL;
                if (b) {
                        char *o = SA_NEW_ARRAY(sql->ta, char, strlen(b) + 
strlen(s) + 2);
                        if (o)
-                               stpcpy(stpcpy(stpcpy(o, b), "."), s);
+                               stpcpy(stpcpy(stpcpy(o, b), sep), s);
                        b = o;
                        if (b == NULL)
                                return NULL;
@@ -207,9 +226,11 @@ symbol_escape_ident(allocator *sa, const
        return res;
 }
 
-char *
+static char *
 sp_symbol2string(mvc *sql, symbol *se, int expression, char **err)
 {
+       if (!se)
+               return "EMPTY SYMBOL ";
        /* inner sp_symbol2string uses the temporary allocator */
        switch (se->token) {
        case SQL_NOP: {
@@ -300,7 +321,7 @@ sp_symbol2string(mvc *sql, symbol *se, i
                                stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "\""), 
first), "\".\""), second), "\"");
                        return res;
                } else {
-                       char *e = dlist2string(sql, l, expression, err);
+                       char *e = dlist2string(sql, l, ".", expression, err);
                        if (e)
                                *err = e;
                        return NULL;
@@ -316,12 +337,34 @@ sp_symbol2string(mvc *sql, symbol *se, i
                        stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "cast("), val), 
" as "), tpe), ")");
                return res;
        }
-       default: {
-               const char msg[] = "SQL feature not yet available for 
expressions and default values: ";
-               char *tok_str = token2string(se->token);
-               if ((*err = SA_NEW_ARRAY(sql->ta, char, strlen(msg) + 
strlen(tok_str) + 1)))
-                       stpcpy(stpcpy(*err, msg), tok_str);
-       }
+       case SQL_SET: { /* dlist(ident-list, expression) */
+                                         dlist *set = se->data.lval;
+                                         char *ident = dlist2string(sql, 
set->h->data.lval, ".", expression, err);
+                                         char *exp = dnode2string(sql, 
set->h->next, expression, err);
+                                         int len = strlen(ident) + strlen(exp);
+                                         char *res;
+                                         if ((res = SA_NEW_ARRAY(sql->ta, 
char, len + 6)))
+                                                       
stpcpy(stpcpy(stpcpy(stpcpy(res, "SET "), ident), " "), exp);
+                                         return res;
+                               }
+       default:
+               /* generic */
+               if (se->type == type_list) {
+                       char *tok_str = token2string(se->token);
+                       char *args = dlist2string(sql, se->data.lval, ", ", 
expression, err);
+                       char *res;
+
+                       if (!args)
+                               args = "";
+                       if ((res = SA_NEW_ARRAY(sql->ta, char, strlen(tok_str) 
+ strlen(args) + 5)))
+                               stpcpy(stpcpy(stpcpy(stpcpy(res, tok_str), "( 
"), args), ") ");
+                       return res;
+               } else {
+                       const char msg[] = "SQL feature not yet available for 
expressions and default values: ";
+                       char *tok_str = token2string(se->token);
+                       if ((*err = SA_NEW_ARRAY(sql->ta, char, strlen(msg) + 
strlen(tok_str) + 1)))
+                               stpcpy(stpcpy(*err, msg), tok_str);
+               }
        }
        return NULL;
 }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to