Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv11383/src/server

Modified Files:
        bin_optimizer.mx sql_optimize.mx sql_parser.mx sql_rel2bin.mx 
        sql_semantic.mx sql_statement.mx sql_updates.mx 
Log Message:
added support for copy select .. into 'filename';



Index: sql_semantic.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_semantic.mx,v
retrieving revision 1.175
retrieving revision 1.176
diff -u -d -r1.175 -r1.176
--- sql_semantic.mx     27 Nov 2007 09:13:24 -0000      1.175
+++ sql_semantic.mx     3 Jan 2008 09:41:18 -0000       1.176
@@ -1082,6 +1082,7 @@
                break;
        }
        case SQL_COPYFROM:
+       case SQL_COPYTO:
        case SQL_INSERT:
        case SQL_UPDATE:
        case SQL_DELETE:

Index: sql_updates.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_updates.mx,v
retrieving revision 1.128
retrieving revision 1.129
diff -u -d -r1.128 -r1.129
--- sql_updates.mx      13 Dec 2007 16:08:18 -0000      1.128
+++ sql_updates.mx      3 Jan 2008 09:41:18 -0000       1.129
@@ -1375,7 +1375,7 @@
    where import is a function returning a table of to be inserted values.
  */
 static stmt *
-sql_bulkinsert(mvc *sql, sql_table *t, char *tsep, char *rsep, char *ssep, 
char *filename, int nr, int offset)
+sql_import(mvc *sql, sql_table *t, char *tsep, char *rsep, char *ssep, char 
*filename, int nr, int offset)
 {
        stmt *rs = NULL;
        stmt *fname = (filename) ? stmt_atom_string(_strdup(filename)) : NULL;
@@ -1383,7 +1383,7 @@
        int i, len = 0;
        stmt **inserts, *res = NULL;
 
-       rs = stmt_bulkinsert(stmt_basetable(t, t->base.name), _strdup(tsep), 
_strdup(rsep), _strdup(ssep), fname, nr, offset);
+       rs = stmt_import(stmt_basetable(t, t->base.name), _strdup(tsep), 
_strdup(rsep), _strdup(ssep), fname, nr, offset);
        len = list_length(t->columns.set);
        inserts = NEW_ARRAY(stmt *, len);
 
@@ -1436,12 +1436,35 @@
                for (slist = create_stmt_list(); n; n = n->next) {
                        char *fname = n->data.sval;
 
-                       list_append(slist, sql_bulkinsert(sql, t, tsep, rsep, 
ssep, fname, nr, offset));
+                       list_append(slist, sql_import(sql, t, tsep, rsep, ssep, 
fname, nr, offset));
                }
                return stmt_list(slist);
        }
        slist = create_stmt_list();
-       list_append(slist, sql_bulkinsert(sql, t, tsep, rsep, ssep, NULL, nr, 
offset));
+       list_append(slist, sql_import(sql, t, tsep, rsep, ssep, NULL, nr, 
offset));
+       return stmt_list(slist);
+}
+
+static stmt *
+copyto(mvc *sql, symbol *sq, str file, dlist *seps)
+{
+       char *tsep = seps->h->data.sval;
+       char *rsep = seps->h->next->data.sval;
+       char *ssep = (seps->h->next->next)?seps->h->next->next->data.sval:"";
+       stmt *s = flat_subquery(sql, sq);
+       list *slist;
+
+       if (!s) 
+               return NULL;
+
+       slist = create_stmt_list();
+       list_append(slist, stmt_export(s, _strdup(tsep), _strdup(rsep), 
_strdup(ssep), stmt_atom_string(_strdup(file))));
+       if (s->type == st_list && ((stmt*)s->op1.lval->h->data)->nrcols != 0) {
+               stmt *cnt = stmt_aggr(stmt_dup(s->op1.lval->h->data), NULL, 
sql_bind_aggr(sql->session->schema, "count", NULL), 1);
+               list_append(slist, stmt_affected_rows(cnt));
+       } else {
+               list_append(slist, stmt_affected_rows(stmt_atom_int(1)));
+       }
        return stmt_list(slist);
 }
 
@@ -1948,6 +1971,14 @@
                sql->type = Q_UPDATE;
        }
                break;
+       case SQL_COPYTO:
+       {
+               dlist *l = s->data.lval;
+
+               ret = copyto(sql, l->h->data.sym, l->h->next->data.sval, 
l->h->next->next->data.lval);
+               sql->type = Q_UPDATE;
+       }
+               break;
        case SQL_INSERT:
        {
                dlist *l = s->data.lval;

Index: sql_rel2bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_rel2bin.mx,v
retrieving revision 1.113
retrieving revision 1.114
diff -u -d -r1.113 -r1.114
--- sql_rel2bin.mx      30 Dec 2007 18:25:27 -0000      1.113
+++ sql_rel2bin.mx      3 Jan 2008 09:41:18 -0000       1.114
@@ -218,7 +218,8 @@
        case st_output:
        case st_affected_rows:
 
-       case st_bulkinsert:
+       case st_import:
+       case st_export:
 
        case st_exception:
 
@@ -838,7 +839,8 @@
        case st_basetable:
 
        case st_atom:
-       case st_bulkinsert:
+       case st_import:
+       case st_export:
        case st_var:
        case st_table_clear:
 

Index: sql_statement.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_statement.mx,v
retrieving revision 1.155
retrieving revision 1.156
diff -u -d -r1.155 -r1.156
--- sql_statement.mx    21 Dec 2007 17:02:26 -0000      1.155
+++ sql_statement.mx    3 Jan 2008 09:41:18 -0000       1.156
@@ -91,7 +91,8 @@
        st_intersect,
        st_union,
 
-       st_bulkinsert,
+       st_import,
+       st_export,
        st_append,
        st_table_clear,
        st_exception,
@@ -218,7 +219,8 @@
 
 extern stmt *stmt_append(stmt *c, stmt *values);
 extern stmt *stmt_table_clear(sql_table *t);
-extern stmt *stmt_bulkinsert(stmt *t, char *sep, char *rsep, char *ssep, stmt 
*file, int nr, int offset);
+extern stmt *stmt_import(stmt *t, char *sep, char *rsep, char *ssep, stmt 
*file, int nr, int offset);
+extern stmt *stmt_export(stmt *t, char *sep, char *rsep, char *ssep, stmt 
*file);
 extern stmt *stmt_temp(sql_subtype *t);
 extern stmt *stmt_atom(atom *op1);
 extern stmt *stmt_atom_string(char *s);
@@ -384,7 +386,8 @@
                ST(intersect);
                ST(union);
 
-               ST(bulkinsert);
+               ST(import);
+               ST(export);
                ST(append);
                ST(table_clear);
                ST(exception);
@@ -711,7 +714,8 @@
                                stmt_destroy(s->op3.stval);
                        break;
 
-               case st_bulkinsert:
+               case st_import:
+               case st_export:
                        if (s->op1.stval)
                                stmt_destroy(s->op1.stval);
                        if (s->op2.lval)
@@ -941,7 +945,8 @@
                        if (s->op3.stval)
                                dep_list = list_merge_destroy(dep_list, 
stmt_list_dependencies(s->op3.stval, depend_type), (fdup)NULL);
                        break;
-               case st_bulkinsert:
+               case st_import:
+               case st_export:
                        if (s->op1.stval)
                                dep_list = list_merge_destroy(dep_list, 
stmt_list_dependencies(s->op1.stval, depend_type), (fdup)NULL);
                        if (s->op4.stval)
@@ -1806,9 +1811,9 @@
 }
 
 stmt *
-stmt_bulkinsert(stmt *t, char *sep, char *rsep, char *ssep, stmt *file, int 
nr, int offset)
+stmt_import(stmt *t, char *sep, char *rsep, char *ssep, stmt *file, int nr, 
int offset)
 {
-       stmt *s = stmt_create(st_bulkinsert);
+       stmt *s = stmt_create(st_import);
        int *l;
 
        s->op1.stval = t;
@@ -1825,6 +1830,20 @@
 }
 
 stmt *
+stmt_export(stmt *t, char *sep, char *rsep, char *ssep, stmt *file)
+{
+       stmt *s = stmt_create(st_export);
+
+       s->op1.stval = t;
+       s->op2.lval = list_create((fdestroy)& GDKfree);
+       list_append(s->op2.lval, sep);
+       list_append(s->op2.lval, rsep);
+       list_append(s->op2.lval, ssep);
+       s->op4.stval = file;
+       return s;
+}
+
+stmt *
 stmt_list(list *l)
 {
        int nrcols = 0;
@@ -2810,11 +2829,13 @@
                case st_uselect: case st_uselect2:
                case st_semijoin:
 
-               case st_bulkinsert:
+               case st_import:
+               case st_export:
                        if (s->op1.stval) 
                                fprintf(fp, "id%d -> id%d [headlabel=\"1\"];\n",
                                        stmt_stmt2dot(s->op1.stval, l, i, fp), 
-(s->optimized));
-                       if (s->type == st_bulkinsert && s->op4.stval) 
+                       if ((s->type == st_import ||
+                            s->type == st_export) && s->op4.stval) 
                                fprintf(fp, "id%d -> id%d [headlabel=\"4\"];\n",
                                        stmt_stmt2dot(s->op4.stval, l, i, fp), 
-(s->optimized));
                        break;
@@ -2906,8 +2927,9 @@
        case st_exception:
                        printf("exception\n"); break;
        case st_rs_column:
-       case st_bulkinsert:
-                       printf("bulkinsert\n"); break;
+       case st_import:
+       case st_export:
+                       printf("import/export\n"); break;
        case st_affected_rows: 
        case st_while: 
        case st_if: 

Index: sql_optimize.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_optimize.mx,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -d -r1.87 -r1.88
--- sql_optimize.mx     30 Dec 2007 18:25:27 -0000      1.87
+++ sql_optimize.mx     3 Jan 2008 09:41:18 -0000       1.88
@@ -1684,7 +1684,7 @@
        case st_bat:
 
        case st_atom:
-       case st_bulkinsert:
+       case st_import:
        case st_var:
 
                s->optimized = 1;
@@ -1774,6 +1774,7 @@
        case st_return:
        case st_table:
        case st_assign:
+       case st_export:
 
                if (s->op1.stval) {
                        stmt *os = s->op1.stval;
@@ -1784,6 +1785,11 @@
                        stmt_destroy(os);
                }
 
+               if (s->type == st_export || s->type == st_convert) {
+                       s->optimized = 1;
+                       return stmt_dup(s);
+               }
+
        case st_append_col:
        case st_append_idx:
        case st_update_col:
@@ -1791,23 +1797,21 @@
        case st_delete:
        case st_table_clear:
 
-               if (s->type != st_convert) {
-                       if (s->op2.stval) {
-                               stmt *os = s->op2.stval;
-                               stmt *ns = optimize(c, os);
+               if (s->op2.stval) {
+                       stmt *os = s->op2.stval;
+                       stmt *ns = optimize(c, os);
        
-                               assert(ns != s);
-                               s->op2.stval = ns;
-                               stmt_destroy(os);
-                       }
-                       if (s->op3.stval) {
-                               stmt *os = s->op3.stval;
-                               stmt *ns = optimize(c, os);
+                       assert(ns != s);
+                       s->op2.stval = ns;
+                       stmt_destroy(os);
+               }
+               if (s->op3.stval) {
+                       stmt *os = s->op3.stval;
+                       stmt *ns = optimize(c, os);
        
-                               assert(ns != s);
-                               s->op3.stval = ns;
-                               stmt_destroy(os);
-                       }
+                       assert(ns != s);
+                       s->op3.stval = ns;
+                       stmt_destroy(os);
                }
                s->optimized = 1;
                return stmt_dup(s);

Index: bin_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/bin_optimizer.mx,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- bin_optimizer.mx    30 Dec 2007 18:25:27 -0000      1.8
+++ bin_optimizer.mx    3 Jan 2008 09:41:18 -0000       1.9
@@ -252,7 +252,8 @@
        case st_idxbat:
 
        case st_atom:
-       case st_bulkinsert:
+       case st_import:
+       case st_export:
        case st_var:
        case st_table_clear:
 

Index: sql_parser.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_parser.mx,v
retrieving revision 1.267
retrieving revision 1.268
diff -u -d -r1.267 -r1.268
--- sql_parser.mx       20 Dec 2007 08:52:02 -0000      1.267
+++ sql_parser.mx       3 Jan 2008 09:41:18 -0000       1.268
@@ -2394,6 +2394,12 @@
          append_list(l, $7);
          append_list(l, $2);
          $$ = _symbol_create_list( SQL_COPYFROM, l ); }
+  | COPY select_no_parens INTO string opt_seps 
+       { dlist *l = L();
+         append_symbol(l, $2);
+         append_string(l, $4);
+         append_list(l, $5);
+         $$ = _symbol_create_list( SQL_COPYTO, l ); }
   ;
 
 opt_seps:


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to