Changeset: 1db236a2f672 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1db236a2f672
Modified Files:
sql/server/rel_semantic.c
sql/server/rel_updates.c
Branch: copyintobinary
Log Message:
Emit a plan.
Reduce flag 'ddl_output'. Maybe we should introduce ddl_binoutput
but ddl_output is checked for in many places.
diffs (97 lines):
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -178,9 +178,10 @@ rel_semantic(sql_query *query, symbol *s
case SQL_TRUNCATE:
case SQL_MERGE:
case SQL_COPYFROM:
+ case SQL_COPYTO:
case SQL_BINCOPYFROM:
+ case SQL_BINCOPYTO:
case SQL_COPYLOADER:
- case SQL_COPYTO:
return rel_updates(query, s);
case SQL_WITH:
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1920,6 +1920,59 @@ copyto(sql_query *query, symbol *sq, con
return rel_output(sql, r, tsep_e, rsep_e, ssep_e, ns_e, fname_e,
oncl_e);
}
+static sql_rel *
+bincopyto(sql_query *query, symbol *qry, endianness endian, dlist *filenames,
int on_client)
+{
+ mvc *sql = query->sql;
+
+ // First emit code for the subquery.
+ // Don't know what this is for, copy pasted it from copyto():
+ exp_kind ek = { type_value, card_relation, TRUE};
+ sql_rel *sub = rel_subquery(query, qry, ek);
+ if (!sub)
+ return NULL;
+ // Again, copy-pasted. copyto() uses this to check for duplicate column
names
+ // but we don't care about that here.
+ sub = rel_project(sql->sa, sub, rel_projections(sql, sub, NULL, 1, 0));
+
+ sql_rel *rel = rel_create(sql->sa);
+ list *exps = new_exp_list(sql->sa);
+ if (!rel || !exps)
+ return NULL;
+
+ append(exps, exp_atom_int(sql->sa, endian));
+ append(exps, exp_atom_int(sql->sa, on_client));
+
+ for (dnode *n = filenames->h; n != NULL; n = n->next) {
+ const char *filename = n->data.sval;
+ // Again, copied from copyto()
+ if (!on_client && filename) {
+ struct stat fs;
+ if (!copy_allowed(sql, 0))
+ return sql_error(sql, 02, SQLSTATE(42000) "COPY
INTO: insufficient privileges: "
+ "COPY INTO file requires
database administrator rights, "
+ "use 'COPY ... INTO file ON
CLIENT' instead");
+ if (filename && !MT_path_absolute(filename))
+ return sql_error(sql, 02, SQLSTATE(42000) "COPY
INTO ON SERVER: filename must "
+ "have absolute path: %s",
filename);
+ if (lstat(filename, &fs) == 0)
+ return sql_error(sql, 02, SQLSTATE(42000) "COPY
INTO ON SERVER: file already "
+ "exists: %s", filename);
+ }
+ append(exps, exp_atom_clob(sql->sa, filename));
+ }
+
+ rel->l = sub;
+ rel->r = NULL;
+ rel->op = op_ddl;
+ rel->flag = ddl_output;
+ rel->exps = exps;
+ rel->card = 0;
+ rel->nrcols = 0;
+
+ return rel;
+}
+
sql_exp *
rel_parse_val(mvc *m, sql_schema *sch, char *query, sql_subtype *tpe, char
emode, sql_rel *from)
{
@@ -2059,6 +2112,18 @@ rel_updates(sql_query *query, symbol *s)
sql->type = Q_UPDATE;
}
break;
+ case SQL_BINCOPYTO:
+ {
+ dlist *l = s->data.lval;
+ symbol *qry = l->h->data.sym;
+ endianness endian = l->h->next->data.i_val;
+ dlist *files = l->h->next->next->data.lval;
+ int on_client = l->h->next->next->next->data.i_val;
+
+ ret = bincopyto(query, qry, endian, files, on_client);
+ sql->type = Q_UPDATE; // doesn't really update but it sure
doesn't return a result set
+ }
+ break;
case SQL_INSERT:
{
dlist *l = s->data.lval;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]