Changeset: 813e6458abdf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/813e6458abdf
Modified Files:
sql/server/rel_updates.c
sql/server/sql_parser.y
Branch: default
Log Message:
Add DECIMAL DELIMITER clause to COPY INTO syntax
Because of how the parser works,
DEC DELIMITER and NUMERIC DELIMITER are also accepted.
I kind of like that.
diffs (124 lines):
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
@@ -1555,7 +1555,7 @@ rel_import(mvc *sql, sql_table *t, const
}
static sql_rel *
-copyfrom(sql_query *query, dlist *qname, dlist *columns, dlist *files, dlist
*headers, dlist *seps, dlist *nr_offset, str null_string, int best_effort,
dlist *fwf_widths, int onclient, int escape)
+copyfrom(sql_query *query, dlist *qname, dlist *columns, dlist *files, dlist
*headers, dlist *seps, dlist *nr_offset, str null_string, int best_effort,
dlist *fwf_widths, int onclient, int escape, dlist *decimal_seps)
{
mvc *sql = query->sql;
sql_rel *rel = NULL;
@@ -1570,6 +1570,8 @@ copyfrom(sql_query *query, dlist *qname,
lng offset = (nr_offset)?nr_offset->h->next->data.l_val:0;
list *collist;
int reorder = 0;
+ const char *decsep = decimal_seps->h->data.sval;
+
assert(!nr_offset || nr_offset->h->type == type_lng);
assert(!nr_offset || nr_offset->h->next->type == type_lng);
@@ -1583,6 +1585,14 @@ copyfrom(sql_query *query, dlist *qname,
"that will never match, use '\\n' instead");
}
+ if (strlen(decsep) != 1
+ || decsep[0] <= ' '
+ || decsep[0] >= 127
+ || decsep[0] == '-' || decsep[0] == '+'
+ || (decsep[0] >= '0' && decsep[0] <= '9')) {
+ return sql_error(sql, 02, SQLSTATE(42000) "COPY INTO: invalid
decimal separator");
+ }
+
t = find_table_or_view_on_scope(sql, NULL, sname, tname, "COPY INTO",
false);
if (insert_allowed(sql, t, tname, "COPY INTO", "copy into") == NULL)
return NULL;
@@ -2089,7 +2099,8 @@ rel_updates(sql_query *query, symbol *s)
l->h->next->next->next->next->next->next->next->data.i_val,
l->h->next->next->next->next->next->next->next->next->data.lval,
l->h->next->next->next->next->next->next->next->next->next->data.i_val,
-
l->h->next->next->next->next->next->next->next->next->next->next->data.i_val);
+
l->h->next->next->next->next->next->next->next->next->next->next->data.i_val,
+
l->h->next->next->next->next->next->next->next->next->next->next->next->data.lval);
sql->type = Q_UPDATE;
}
break;
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -490,6 +490,7 @@ int yydebug=1;
opt_referencing_list
opt_schema_element_list
opt_seps
+ opt_decimal_seps
opt_seq_params
opt_typelist
opt_with_encrypted_password
@@ -2918,8 +2919,8 @@ opt_on_location:
;
copyfrom_stmt:
-// 1 2 3 4 5 6 7 8
9 10 11 12 13 14
- COPY opt_nr INTO qname opt_column_list FROM string_commalist
opt_header_list opt_on_location opt_seps opt_escape opt_null_string
opt_best_effort opt_fwf_widths
+// 1 2 3 4 5 6 7 8
9 10 11 12 13 14
15
+ COPY opt_nr INTO qname opt_column_list FROM string_commalist
opt_header_list opt_on_location opt_seps opt_decimal_seps opt_escape
opt_null_string opt_best_effort opt_fwf_widths
{ dlist *l = L();
append_list(l, $4);
append_list(l, $5);
@@ -2927,14 +2928,15 @@ copyfrom_stmt:
append_list(l, $8);
append_list(l, $10);
append_list(l, $2);
- append_string(l, $12);
- append_int(l, $13);
- append_list(l, $14);
+ append_string(l, $13);
+ append_int(l, $14);
+ append_list(l, $15);
append_int(l, $9);
- append_int(l, $11);
+ append_int(l, $12);
+ append_list(l, $11);
$$ = _symbol_create_list( SQL_COPYFROM, l ); }
-// 1 2 3 4 5 6 7 8 9
10 11 12
- | COPY opt_nr INTO qname opt_column_list FROM STDIN opt_header_list
opt_seps opt_escape opt_null_string opt_best_effort
+// 1 2 3 4 5 6 7 8 9
10 11 12 13
+ | COPY opt_nr INTO qname opt_column_list FROM STDIN opt_header_list
opt_seps opt_decimal_seps opt_escape opt_null_string opt_best_effort
{ dlist *l = L();
append_list(l, $4);
append_list(l, $5);
@@ -2942,11 +2944,12 @@ copyfrom_stmt:
append_list(l, $8);
append_list(l, $9);
append_list(l, $2);
- append_string(l, $11);
- append_int(l, $12);
+ append_string(l, $12);
+ append_int(l, $13);
append_list(l, NULL);
append_int(l, 0);
- append_int(l, $10);
+ append_int(l, $11);
+ append_list(l, $10);
$$ = _symbol_create_list( SQL_COPYFROM, l ); }
// 1 2 3 4 5 6
| COPY sqlLOADER INTO qname FROM func_ref
@@ -3051,6 +3054,17 @@ opt_seps:
$$ = l; }
;
+opt_decimal_seps:
+ /* empty */
+ { dlist *l = L();
+ append_string(l, sa_strdup(SA, "."));
+ $$ = l; }
+ | sqlDECIMAL DELIMITERS string
+ { dlist *l = L();
+ append_string(l, $3);
+ $$ = l; }
+;
+
opt_using:
/* empty */ { $$ = NULL; }
| USING { $$ = NULL; }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]