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

Reply via email to