Changeset: 22ca3873e29b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/22ca3873e29b
Modified Files:
sql/server/sqlparse.c
Branch: default
Log Message:
Implements indent in sqlparse tool
diffs (221 lines):
diff --git a/sql/server/sqlparse.c b/sql/server/sqlparse.c
--- a/sql/server/sqlparse.c
+++ b/sql/server/sqlparse.c
@@ -7,7 +7,6 @@
#include "sql_semantic.h"
#include <stdio.h>
-
extern void bat_storage_init(void *b);
extern void bat_table_init(void *b);
extern void bat_logger_init(void *b);
@@ -156,11 +155,11 @@ 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, char *lb, char *rb,
int expression, char **err);
+static char * sp_symbol2string(mvc *sql, symbol *se, int expression, char
**err, int depth);
+static char * dlist2string(mvc *sql, dlist *l, char *sep, char *lb, char *rb,
int expression, char **err, int depth, bool indent);
static char *
-dnode2string(mvc *sql, dnode *n, int expression, char **err)
+dnode2string(mvc *sql, dnode *n, int expression, char **err, int depth)
{
char *s = NULL;
if (n->type == type_string) {
@@ -177,9 +176,9 @@ dnode2string(mvc *sql, dnode *n, int exp
snprintf(buf, sizeof(buf), LLFMT, n->data.l_val);
s = sa_strdup(sql->ta, buf);
} else if (n->type == type_symbol) {
- s = sp_symbol2string(sql, n->data.sym, expression, err);
+ s = sp_symbol2string(sql, n->data.sym, expression, err, depth);
} else if (n->type == type_list) {
- s = dlist2string(sql, n->data.lval, ", ", "( ", " )",
expression, err);
+ s = dlist2string(sql, n->data.lval, ", ", "( ", " )",
expression, err, depth, false);
} else if (n->type == type_type) {
s = sql_subtype_string(sql->ta, &n->data.typeval);
}
@@ -187,7 +186,7 @@ dnode2string(mvc *sql, dnode *n, int exp
}
static char *
-dlist2string(mvc *sql, dlist *l, char *sep, char *lb, char *rb, int
expression, char **err)
+dlist2string(mvc *sql, dlist *l, char *sep, char *lb, char *rb, int
expression, char **err, int depth, bool indent)
{
if (!l)
return " EMPTY_LIST";
@@ -195,20 +194,29 @@ dlist2string(mvc *sql, dlist *l, char *s
dnode *n;
size_t seplen = strlen(sep);
- bool skipsep = lb;
+
+ bool first_el = lb;
for (n=l->h; n; n = n->next) {
- char *s = dnode2string(sql, n, expression, err);
+ char *s = dnode2string(sql, n, expression, err, depth);
if (!s)
return NULL;
if (b) {
- char *o = SA_NEW_ARRAY(sql->ta, char, strlen(b) +
strlen(s) + seplen + 1);
+ size_t depth_chars = indent ? depth + 1 : 0;
+ char *o = SA_NEW_ARRAY(sql->ta, char, depth_chars +
strlen(b) + strlen(s) + seplen + 1);
if (o) {
- if (skipsep)
- stpcpy(stpcpy(o, b), s);
- else
- stpcpy(stpcpy(stpcpy(o, b), sep), s);
- skipsep = false;
+ char *tmp;
+ tmp = stpcpy(o, b);
+ if (!first_el)
+ tmp = stpcpy(tmp, sep);
+ if (indent) {
+ tmp = stpcpy(tmp, "\n");
+ for (int i=0; i < depth; i++)
+ tmp = stpcpy(tmp, "\t");
+ }
+ tmp = stpcpy(tmp, s);
+
+ first_el = false;
}
b = o;
if (b == NULL)
@@ -218,9 +226,20 @@ dlist2string(mvc *sql, dlist *l, char *s
}
}
if (rb) {
- char *o = SA_NEW_ARRAY(sql->ta, char, strlen(b) + strlen(rb) +
1);
- if (o)
- stpcpy(stpcpy(o, b), rb);
+ /* here we do (depth - 1) * tab + 1 * newline to align with the
parent op */
+ size_t depth_chars = indent ? depth : 0;
+
+ char *o = SA_NEW_ARRAY(sql->ta, char, depth_chars + strlen(b) +
strlen(rb) + 1);
+ if (o) {
+ char *tmp;
+ tmp = stpcpy(o, b);
+ if (indent) {
+ tmp = stpcpy(tmp, "\n");
+ for (int i=0; i < (depth - 1); i++)
+ tmp = stpcpy(tmp, "\t");
+ }
+ stpcpy(tmp, rb);
+ }
b = o;
}
return b;
@@ -265,7 +284,7 @@ sa_concat(allocator *sa, char *prefix, c
}
static char *
-sp_symbol2string(mvc *sql, symbol *se, int expression, char **err)
+sp_symbol2string(mvc *sql, symbol *se, int expression, char **err, int depth)
{
if (!se)
return "EMPTY SYMBOL";
@@ -275,17 +294,17 @@ sp_symbol2string(mvc *sql, symbol *se, i
SelectNode *s = (SelectNode*)se;
char *res = s->distinct?"SELECT DISTINCT (\n":"SELECT (\n";
if (s->from)
- res = sa_concat(sql->ta, " ", res, NULL,
sp_symbol2string(sql, s->from, expression, err), "\n");
+ res = sa_concat(sql->ta, " ", res, NULL,
sp_symbol2string(sql, s->from, expression, err, depth), "\n");
if (s->where)
- res = sa_concat(sql->ta, " ", res, "WHERE ",
sp_symbol2string(sql, s->where, expression, err), "\n");
+ res = sa_concat(sql->ta, " ", res, "WHERE ",
sp_symbol2string(sql, s->where, expression, err, depth + 1), "\n");
if (s->groupby)
- res = sa_concat(sql->ta, " ", res, NULL,
sp_symbol2string(sql, s->groupby, expression, err), "\n");
+ res = sa_concat(sql->ta, " ", res, NULL,
sp_symbol2string(sql, s->groupby, expression, err, depth), "\n");
if (s->having)
- res = sa_concat(sql->ta, " ", res, "HAVING ",
sp_symbol2string(sql, s->having, expression, err), "\n");
+ res = sa_concat(sql->ta, " ", res, "HAVING ",
sp_symbol2string(sql, s->having, expression, err, depth), "\n");
if (s->orderby)
- res = sa_concat(sql->ta, " ", res, NULL,
sp_symbol2string(sql, s->orderby, expression, err), "\n");
+ res = sa_concat(sql->ta, " ", res, NULL,
sp_symbol2string(sql, s->orderby, expression, err, depth), "\n");
if (s->selection)
- res = sa_concat(sql->ta, " ", res, "SELECTION ",
dlist2string(sql, s->selection, ", ", "( ", " )", expression, err), "\n");
+ res = sa_concat(sql->ta, " ", res, "SELECTION ",
dlist2string(sql, s->selection, ", ", "( ", " )", expression, err, depth,
false), "\n");
return res;
}
case SQL_NOP: {
@@ -305,7 +324,7 @@ sp_symbol2string(mvc *sql, symbol *se, i
return NULL;
for (aux = ops; aux; aux = aux->next) {
- if (!(inputs[i] = sp_symbol2string(sql, aux->data.sym,
expression, err))) {
+ if (!(inputs[i] = sp_symbol2string(sql, aux->data.sym,
expression, err, 0))) {
return NULL;
}
inputs_length += strlen(inputs[i]);
@@ -379,14 +398,15 @@ sp_symbol2string(mvc *sql, symbol *se, i
stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "\""),
first), "\".\""), second), "\"");
return res;
} else {
- return dlist2string(sql, l, ".", NULL, NULL,
expression, err);
+ return dlist2string(sql, l, ".", NULL, NULL,
expression, err, depth, false);
}
}
case SQL_CAST: {
dlist *dl = se->data.lval;
char *val = NULL, *tpe = NULL, *res;
- if (!(val = sp_symbol2string(sql, dl->h->data.sym, expression,
err)) || !(tpe = subtype2string2(sql->ta, &dl->h->next->data.typeval)))
+ if (!(val = sp_symbol2string(sql, dl->h->data.sym, expression,
err, depth), 0) ||
+ !(tpe = subtype2string2(sql->ta,
&dl->h->next->data.typeval)))
return NULL;
if ((res = SA_NEW_ARRAY(sql->ta, char, strlen(val) +
strlen(tpe) + 11)))
stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "cast("), val),
" as "), tpe), ")");
@@ -394,19 +414,30 @@ sp_symbol2string(mvc *sql, symbol *se, i
}
case SQL_SET: { /* dlist(ident-list, expression) */
dlist *set = se->data.lval;
- char *ident = dlist2string(sql,
set->h->data.lval, ".", NULL, NULL, expression, err);
- char *exp = dnode2string(sql,
set->h->next, expression, err);
+ char *ident = dlist2string(sql,
set->h->data.lval, ".", NULL, NULL, expression, err, depth, false);
+ char *exp = dnode2string(sql,
set->h->next, expression, err, depth);
size_t 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;
}
+ case SQL_AND:
+ case SQL_OR:
+ char *tok_str = token2string(se->token);
+ char *args = dlist2string(sql, se->data.lval, ", ", " (", " )",
expression, err, depth + 1, true);
+ char *res;
+
+ if (!args)
+ args = "";
+ if ((res = SA_NEW_ARRAY(sql->ta, char, strlen(tok_str) +
strlen(args) + 1)))
+ stpcpy(stpcpy(res, tok_str), args);
+ 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 *args = dlist2string(sql, se->data.lval, ", ", "(
", " )", expression, err, depth, false);
char *res;
if (!args)
@@ -416,7 +447,7 @@ sp_symbol2string(mvc *sql, symbol *se, i
return res;
} else if (se->type == type_symbol) {
char *tok_str = token2string(se->token);
- char *sym = sp_symbol2string(sql, se->data.sym,
expression, err);
+ char *sym = sp_symbol2string(sql, se->data.sym,
expression, err, 0);
char *res;
if ((res = SA_NEW_ARRAY(sql->ta, char, strlen(tok_str)
+ strlen(sym) + 5)))
@@ -489,7 +520,7 @@ main(int argc, char *argv[])
while ((err = sqlparse(m)) == 0 && m->scanner.rs->pos <
m->scanner.rs->len) {
if (m->sym) {
char *err = NULL;
- char *res = sp_symbol2string(m, m->sym, 1, &err);
+ char *res = sp_symbol2string(m, m->sym, 1, &err, 0);
if (err)
printf("ERROR: %s\n", err);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]