Changeset: 29971ee46151 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=29971ee46151 Branch: default Log Message:
Merge atom_strings branch into default. diffs (truncated from 2410 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -8419,7 +8419,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_2:int, X_3:str, X_4:str, X_5:str, X_6:int, X_7:int, X_8:int) (X_0:bat[:oid], X_1:bat[:any_1]) ", "mvc_bind_idxbat_wrap;", "" ] [ "sql", "clear_table", "unsafe pattern sql.clear_table(X_1:str, X_2:str):lng ", "mvc_clear_table_wrap;", "" ] [ "sql", "commit", "unsafe pattern sql.commit():void ", "SQLcommit;", "" ] -[ "sql", "copy_from", "unsafe pattern sql.copy_from(X_1:ptr, X_2:str, X_3:str, X_4:str, X_5:str, X_6:str, X_7:lng, X_8:lng, X_9:int, X_10:int, X_11:str, X_12:int):bat[:any]... ", "mvc_import_table_wrap;", "" ] +[ "sql", "copy_from", "unsafe pattern sql.copy_from(X_1:ptr, X_2:str, X_3:str, X_4:str, X_5:str, X_6:str, X_7:lng, X_8:lng, X_9:int, X_10:int, X_11:str, X_12:int, X_13:int):bat[:any]... ", "mvc_import_table_wrap;", "" ] [ "sql", "copy_rejects", "pattern sql.copy_rejects() (X_0:bat[:lng], X_1:bat[:int], X_2:bat[:str], X_3:bat[:str]) ", "COPYrejects;", "" ] [ "sql", "copy_rejects_clear", "unsafe pattern sql.copy_rejects_clear():void ", "COPYrejects_clear;", "" ] [ "sql", "corr", "pattern sql.corr(X_1:bte, X_2:bte, X_3:lng, X_4:lng):dbl ", "SQLcorr;", "" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -11362,7 +11362,7 @@ stdout of test 'MAL-signatures` in direc [ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_2:int, X_3:str, X_4:str, X_5:str, X_6:int, X_7:int, X_8:int) (X_0:bat[:oid], X_1:bat[:any_1]) ", "mvc_bind_idxbat_wrap;", "" ] [ "sql", "clear_table", "unsafe pattern sql.clear_table(X_1:str, X_2:str):lng ", "mvc_clear_table_wrap;", "" ] [ "sql", "commit", "unsafe pattern sql.commit():void ", "SQLcommit;", "" ] -[ "sql", "copy_from", "unsafe pattern sql.copy_from(X_1:ptr, X_2:str, X_3:str, X_4:str, X_5:str, X_6:str, X_7:lng, X_8:lng, X_9:int, X_10:int, X_11:str, X_12:int):bat[:any]... ", "mvc_import_table_wrap;", "" ] +[ "sql", "copy_from", "unsafe pattern sql.copy_from(X_1:ptr, X_2:str, X_3:str, X_4:str, X_5:str, X_6:str, X_7:lng, X_8:lng, X_9:int, X_10:int, X_11:str, X_12:int, X_13:int):bat[:any]... ", "mvc_import_table_wrap;", "" ] [ "sql", "copy_rejects", "pattern sql.copy_rejects() (X_0:bat[:lng], X_1:bat[:int], X_2:bat[:str], X_3:bat[:str]) ", "COPYrejects;", "" ] [ "sql", "copy_rejects_clear", "unsafe pattern sql.copy_rejects_clear():void ", "COPYrejects_clear;", "" ] [ "sql", "corr", "pattern sql.corr(X_1:bte, X_2:bte, X_3:lng, X_4:lng):dbl ", "SQLcorr;", "" ] diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -1083,7 +1083,7 @@ str SERVERsetAlias(void *ret, int *mid, str SERVERstop(void *ret); str SERVERsuspend(void *ret); str SERVERtrace(void *ret, int *mid, int *flag); -BUN SQLload_file(Client cntxt, Tablet *as, bstream *b, stream *out, const char *csep, const char *rsep, char quote, lng skip, lng maxrow, int best, bool from_stdin, const char *tabnam); +BUN SQLload_file(Client cntxt, Tablet *as, bstream *b, stream *out, const char *csep, const char *rsep, char quote, lng skip, lng maxrow, int best, bool from_stdin, const char *tabnam, bool escape); str STRBytes(int *res, const str *arg1); str STRConcat(str *res, const str *val1, const str *val2); str STRFromWChr(str *res, const int *at); diff --git a/clients/mapiclient/Tests/msqldump--help.stable.err b/clients/mapiclient/Tests/msqldump--help.stable.err --- a/clients/mapiclient/Tests/msqldump--help.stable.err +++ b/clients/mapiclient/Tests/msqldump--help.stable.err @@ -21,6 +21,7 @@ Options are: -t table | --table=table dump a database table -D | --describe describe database -N | --inserts use INSERT INTO statements + -e | --noescape use NO ESCAPE -q | --quiet don't print welcome message -X | --Xdebug trace mapi network interaction -? | --help show this usage message diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -122,17 +122,18 @@ dquoted_print(stream *f, const char *s, } static int -squoted_print(stream *f, const char *s, char quote) +squoted_print(stream *f, const char *s, char quote, bool noescape) { assert(quote == '\'' || quote == '"'); if (mnstr_printf(f, "%c", quote) < 0) return -1; while (*s) { - size_t n = strcspn(s, "\\'\"\177" - "\001\002\003\004\005\006\007" - "\010\011\012\013\014\015\016\017" - "\020\021\022\023\024\025\026\027" - "\030\031\032\033\034\035\036\037"); + size_t n = noescape ? strcspn(s, "'\"") : + strcspn(s, "\\'\"\177" + "\001\002\003\004\005\006\007" + "\010\011\012\013\014\015\016\017" + "\020\021\022\023\024\025\026\027" + "\030\031\032\033\034\035\036\037"); if (n > 0 && mnstr_write(f, s, 1, n) < 0) return -1; s += n; @@ -235,7 +236,7 @@ comment_on(stream *toConsole, const char } } if (mnstr_write(toConsole, " IS ", 1, 4) < 0 || - squoted_print(toConsole, remark, '\'') < 0 || + squoted_print(toConsole, remark, '\'', false) < 0 || mnstr_write(toConsole, ";\n", 1, 2) < 0) return -1; } @@ -1307,11 +1308,11 @@ describe_table(Mapi mid, const char *sch rt_hash = mapi_fetch_field(hdl, 1); } mnstr_printf(toConsole, " ON "); - squoted_print(toConsole, view, '\''); + squoted_print(toConsole, view, '\'', false); mnstr_printf(toConsole, " WITH USER "); - squoted_print(toConsole, rt_user, '\''); + squoted_print(toConsole, rt_user, '\'', false); mnstr_printf(toConsole, " ENCRYPTED PASSWORD "); - squoted_print(toConsole, rt_hash, '\''); + squoted_print(toConsole, rt_hash, '\'', false); mapi_close_handle(hdl); hdl = NULL; } else if (type == 3 && has_table_partitions(mid)) { /* A merge table might be partitioned */ @@ -1660,7 +1661,7 @@ describe_schema(Mapi mid, const char *sn static int dump_table_data(Mapi mid, const char *schema, const char *tname, stream *toConsole, - bool useInserts) + bool useInserts, bool noescape) { int cnt, i; int64_t rows; @@ -1743,9 +1744,9 @@ dump_table_data(Mapi mid, const char *sc if (!useInserts) { mnstr_printf(toConsole, "COPY %" PRId64 " RECORDS INTO ", rows); dquoted_print(toConsole, schema, "."); - dquoted_print(toConsole, tname, - " FROM stdin USING DELIMITERS " - "E'\\t',E'\\n','\"';\n"); + dquoted_print(toConsole, tname, NULL); + mnstr_printf(toConsole, " FROM stdin USING DELIMITERS " + "E'\\t',E'\\n','\"'%s;\n", noescape ? " NO ESCAPE" : ""); } string = malloc(sizeof(unsigned char) * cnt); if (string == NULL) @@ -1800,13 +1801,13 @@ dump_table_data(Mapi mid, const char *sc strcmp(tp, "url") == 0 || strcmp(tp, "uuid") == 0 || string[i]) - squoted_print(toConsole, s, '\''); + squoted_print(toConsole, s, '\'', false); else mnstr_printf(toConsole, "%s", s); } else if (string[i]) { /* write double-quoted string with certain characters escaped */ - squoted_print(toConsole, s, '"'); + squoted_print(toConsole, s, '"', noescape); } else mnstr_printf(toConsole, "%s", s); @@ -1862,13 +1863,14 @@ bailout: int dump_table(Mapi mid, const char *schema, const char *tname, stream *toConsole, - bool describe, bool foreign, bool useInserts, bool databaseDump) + bool describe, bool foreign, bool useInserts, bool databaseDump, + bool noescape) { int rc; rc = describe_table(mid, schema, tname, toConsole, foreign, databaseDump); if (rc == 0 && !describe) - rc = dump_table_data(mid, schema, tname, toConsole, useInserts); + rc = dump_table_data(mid, schema, tname, toConsole, useInserts, noescape); return rc; } @@ -2147,7 +2149,7 @@ dump_function(Mapi mid, stream *toConsol free(ascal); } mnstr_printf(toConsole, ") IS "); - squoted_print(toConsole, remark, '\''); + squoted_print(toConsole, remark, '\'', false); mnstr_printf(toConsole, ";\n"); free(remark); } @@ -2291,7 +2293,7 @@ bailout: } int -dump_database(Mapi mid, stream *toConsole, bool describe, bool useInserts) +dump_database(Mapi mid, stream *toConsole, bool describe, bool useInserts, bool noescape) { const char *start_trx = "START TRANSACTION"; const char *end = "ROLLBACK"; @@ -2636,9 +2638,9 @@ dump_database(Mapi mid, stream *toConsol mnstr_printf(toConsole, "CREATE USER "); dquoted_print(toConsole, uname, " "); mnstr_printf(toConsole, "WITH ENCRYPTED PASSWORD "); - squoted_print(toConsole, pwhash, '\''); + squoted_print(toConsole, pwhash, '\'', false); mnstr_printf(toConsole, " NAME "); - squoted_print(toConsole, fullname, '\''); + squoted_print(toConsole, fullname, '\'', false); mnstr_printf(toConsole, " SCHEMA "); dquoted_print(toConsole, describe ? sname : "sys", ";\n"); } @@ -2802,7 +2804,7 @@ dump_database(Mapi mid, stream *toConsol } if (type) { /* table */ int ptype = atoi(type), dont_describe = (ptype == 3 || ptype == 5); - rc = dump_table(mid, schema, name, toConsole, dont_describe || describe, describe, useInserts, true); + rc = dump_table(mid, schema, name, toConsole, dont_describe || describe, describe, useInserts, true, noescape); } else if (query) { /* view or trigger */ mnstr_printf(toConsole, "%s\n", query); @@ -2884,7 +2886,7 @@ dump_database(Mapi mid, stream *toConsol } else { mnstr_printf(toConsole, ", "); } - squoted_print(toConsole, nextv, '\''); + squoted_print(toConsole, nextv, '\'', false); i++; } first = false; @@ -2923,12 +2925,12 @@ dump_database(Mapi mid, stream *toConsol if (minv || maxv || !wnulls || (!minv && !maxv && wnulls && strcmp(wnulls, "false") == 0)) { mnstr_printf(toConsole, " FROM "); if (minv) - squoted_print(toConsole, minv, '\''); + squoted_print(toConsole, minv, '\'', false); else mnstr_printf(toConsole, "RANGE MINVALUE"); mnstr_printf(toConsole, " TO "); if (maxv) - squoted_print(toConsole, maxv, '\''); + squoted_print(toConsole, maxv, '\'', false); else mnstr_printf(toConsole, "RANGE MAXVALUE"); } diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -2645,10 +2645,10 @@ doFile(Mapi mid, stream *fp, bool useins #endif if (*line) { mnstr_printf(toConsole, "START TRANSACTION;\n"); - dump_table(mid, NULL, line, toConsole, false, true, useinserts, false); + dump_table(mid, NULL, line, toConsole, false, true, useinserts, false, false); mnstr_printf(toConsole, "COMMIT;\n"); } else - dump_database(mid, toConsole, 0, useinserts); + dump_database(mid, toConsole, 0, useinserts, false); #ifdef HAVE_POPEN end_pager(saveFD); #endif @@ -3536,7 +3536,7 @@ main(int argc, char **argv) mapi_cache_limit(mid, -1); if (dump) { if (mode == SQL) { - exit(dump_database(mid, toConsole, 0, useinserts)); + exit(dump_database(mid, toConsole, 0, useinserts, false)); } else { fprintf(stderr, "Dump only supported for SQL\n"); exit(1); diff --git a/clients/mapiclient/msqldump.1 b/clients/mapiclient/msqldump.1 --- a/clients/mapiclient/msqldump.1 +++ b/clients/mapiclient/msqldump.1 @@ -74,6 +74,10 @@ COPY INTO + CSV values. INSERT INTO statements are more portable, and necessary when the load of the dump is processed by e.g. a JDBC application. .TP +\fB\-\-noescape\fP (\fB\-e\fP) +When dumping the table data, use the NO ESCAPE option on the COPY INTO +query. +.TP \fB\-\-functions\fP (\fB\-f\fP) Only dump functions definitions. .TP diff --git a/clients/mapiclient/msqldump.c b/clients/mapiclient/msqldump.c --- a/clients/mapiclient/msqldump.c +++ b/clients/mapiclient/msqldump.c @@ -42,6 +42,7 @@ usage(const char *prog, int xit) fprintf(stderr, " -t table | --table=table dump a database table\n"); fprintf(stderr, " -D | --describe describe database\n"); fprintf(stderr, " -N | --inserts use INSERT INTO statements\n"); + fprintf(stderr, " -e | --noescape use NO ESCAPE\n"); fprintf(stderr, " -q | --quiet don't print welcome message\n"); fprintf(stderr, " -X | --Xdebug trace mapi network interaction\n"); fprintf(stderr, " -? | --help show this usage message\n"); @@ -62,6 +63,7 @@ main(int argc, char **argv) bool describe = false; bool functions = false; bool useinserts = false; + bool noescape = false; int c; Mapi mid; bool quiet = false; @@ -76,6 +78,7 @@ main(int argc, char **argv) {"functions", 0, 0, 'f'}, {"table", 1, 0, 't'}, {"inserts", 0, 0, 'N'}, + {"noescape", 0, 0, 'e'}, {"Xdebug", 0, 0, 'X'}, {"user", 1, 0, 'u'}, {"quiet", 0, 0, 'q'}, @@ -91,7 +94,7 @@ main(int argc, char **argv) host = dotfile.host; port = dotfile.port; - while ((c = getopt_long(argc, argv, "h:p:d:Dft:NXu:qv?", long_options, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "h:p:d:Dft:NeXu:qv?", long_options, NULL)) != -1) { switch (c) { case 'u': if (user) @@ -117,6 +120,9 @@ main(int argc, char **argv) case 'N': useinserts = true; break; + case 'e': + noescape = true; + break; case 'f': _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list