Changeset: 663b2cc328ef for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/663b2cc328ef
Branch: extract_types
Log Message:

Merge with default.


diffs (truncated from 9029 to 300 lines):

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
@@ -321,7 +321,7 @@ void GDKreset(int status);
 void GDKsetdebug(int debug);
 gdk_return GDKsetenv(const char *name, const char *value);
 void GDKsetmallocsuccesscount(lng count);
-ssize_t GDKstrFromStr(unsigned char *restrict dst, const unsigned char 
*restrict src, ssize_t len);
+ssize_t GDKstrFromStr(unsigned char *restrict dst, const unsigned char 
*restrict src, ssize_t len, char quote);
 str GDKstrdup(const char *s) __attribute__((__malloc__)) 
__attribute__((__warn_unused_result__));
 str GDKstrndup(const char *s, size_t n) __attribute__((__malloc__)) 
__attribute__((__warn_unused_result__));
 gdk_return GDKtracer_fill_comp_info(BAT *id, BAT *component, BAT *log_level);
diff --git a/clients/odbc/ChangeLog.Sep2022 b/clients/odbc/ChangeLog.Sep2022
--- a/clients/odbc/ChangeLog.Sep2022
+++ b/clients/odbc/ChangeLog.Sep2022
@@ -1,3 +1,7 @@
 # ChangeLog file for odbc
 # This file is updated with Maddlog
 
+* Thu Oct 13 2022 Martin van Dinther <[email protected]>
+- Fixed issue with generated raw strings prefix when ODBC driver is used
+  against a server older than Jun2020 (11.37).
+
diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c
--- a/clients/odbc/driver/ODBCUtil.c
+++ b/clients/odbc/driver/ODBCUtil.c
@@ -1074,6 +1074,7 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                         * ESCAPE '\\'
                         */
                        char esc;
+                       const char *s;
                        p += 7;
                        while (*p == ' ')
                                p++;
@@ -1106,7 +1107,13 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                length = (size_t) snprintf(q, length, "%.*s 
ESCAPE '''' %s", n, nquery, p);
                                break;
                        case '\\':
-                               length = (size_t) snprintf(q, length, "%.*s 
ESCAPE r'\\' %s", n, nquery, p);
+                               /* raw strings prefix syntax is only supported 
by servers since Jun2020 (11.37) */
+                               if (dbc->major == 11 && dbc->minor >= 37) {
+                                       s = "%.*s ESCAPE r'\\'";
+                               } else {
+                                       s = "%.*s ESCAPE '\\\\'";
+                               }
+                               length = (size_t) snprintf(q, length, s, n, 
nquery, p);
                                break;
                        default:
                                length = (size_t) snprintf(q, length, "%.*s 
ESCAPE '%c' %s", n, nquery, esc, p);
@@ -1256,7 +1263,8 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                                for (r = func->repl; *r; r++) {
                                                        if (*r == '\1' || *r == 
'\2' || *r == '\3' || *r == '\4') {
                                                                assert(*r <= 
func->nargs);
-                                                               if (args[*r - 
1].argstart[0] == '\'')
+                                                               /* raw strings 
prefix syntax is only supported by servers since Jun2020 (11.37) */
+                                                               if (args[*r - 
1].argstart[0] == '\'' && dbc->major == 11 && dbc->minor >= 37)
                                                                        q[pr++] 
= 'r';
                                                                strncpy(q + pr, 
args[*r - 1].argstart, args[*r - 1].arglen);
                                                                pr += (int) 
args[*r - 1].arglen;
@@ -1350,7 +1358,7 @@ ODBCParseOA(const char *tab, const char 
 }
 
 char *
-ODBCParsePV(const char *tab, const char *col, const char *arg, size_t len)
+ODBCParsePV(const char *tab, const char *col, const char *arg, size_t len, 
const ODBCDbc *dbc)
 {
        size_t i;
        char *res;
@@ -1371,7 +1379,13 @@ ODBCParsePV(const char *tab, const char 
                        res[i++] = *s;
                res[i++] = *s;
        }
-       for (s = "' escape r'\\'"; *s; s++)
+       /* raw strings prefix syntax is only supported by servers since Jun2020 
(11.37) */
+       if (dbc->major == 11 && dbc->minor >= 37) {
+               s = "' escape r'\\'";
+       } else {
+               s = "' escape '\\\\'";
+       }
+       for (; *s; s++)
                res[i++] = *s;
        res[i] = 0;
        return res;
diff --git a/clients/odbc/driver/ODBCUtil.h b/clients/odbc/driver/ODBCUtil.h
--- a/clients/odbc/driver/ODBCUtil.h
+++ b/clients/odbc/driver/ODBCUtil.h
@@ -31,6 +31,7 @@
 #define _H_ODBCUTIL
 
 #include "ODBCGlobal.h"
+#include "ODBCDbc.h"
 
 
 /*
@@ -145,7 +146,7 @@ extern const char *ODBCutf82wchar(const 
 #endif
 
 char *ODBCParseOA(const char *tab, const char *col, const char *arg, size_t 
len);
-char *ODBCParsePV(const char *tab, const char *col, const char *arg, size_t 
len);
+char *ODBCParsePV(const char *tab, const char *col, const char *arg, size_t 
len, const ODBCDbc *dbc);
 char *ODBCParseID(const char *tab, const char *col, const char *arg, size_t 
len);
 
 /* SQL_DESC_CONCISE_TYPE, SQL_DESC_DATETIME_INTERVAL_CODE, and
diff --git a/clients/odbc/driver/SQLColumnPrivileges.c 
b/clients/odbc/driver/SQLColumnPrivileges.c
--- a/clients/odbc/driver/SQLColumnPrivileges.c
+++ b/clients/odbc/driver/SQLColumnPrivileges.c
@@ -81,7 +81,8 @@ MNDBColumnPrivileges(ODBCStmt *stmt,
                if (NameLength4 > 0) {
                        col = ODBCParsePV("tc", "cname",
                                          (const char *) ColumnName,
-                                         (size_t) NameLength4);
+                                         (size_t) NameLength4,
+                                         stmt->Dbc);
                        if (col == NULL)
                                goto nomem;
                }
diff --git a/clients/odbc/driver/SQLColumns.c b/clients/odbc/driver/SQLColumns.c
--- a/clients/odbc/driver/SQLColumns.c
+++ b/clients/odbc/driver/SQLColumns.c
@@ -79,21 +79,24 @@ MNDBColumns(ODBCStmt *stmt,
                if (NameLength2 > 0) {
                        sch = ODBCParsePV("s", "name",
                                          (const char *) SchemaName,
-                                         (size_t) NameLength2);
+                                         (size_t) NameLength2,
+                                         stmt->Dbc);
                        if (sch == NULL)
                                goto nomem;
                }
                if (NameLength3 > 0) {
                        tab = ODBCParsePV("t", "name",
                                          (const char *) TableName,
-                                         (size_t) NameLength3);
+                                         (size_t) NameLength3,
+                                         stmt->Dbc);
                        if (tab == NULL)
                                goto nomem;
                }
                if (NameLength4 > 0) {
                        col = ODBCParsePV("c", "name",
                                          (const char *) ColumnName,
-                                         (size_t) NameLength4);
+                                         (size_t) NameLength4,
+                                         stmt->Dbc);
                        if (col == NULL)
                                goto nomem;
                }
diff --git a/clients/odbc/driver/SQLProcedureColumns.c 
b/clients/odbc/driver/SQLProcedureColumns.c
--- a/clients/odbc/driver/SQLProcedureColumns.c
+++ b/clients/odbc/driver/SQLProcedureColumns.c
@@ -71,21 +71,24 @@ MNDBProcedureColumns(ODBCStmt *stmt,
                if (NameLength2 > 0) {
                        sch = ODBCParsePV("s", "name",
                                          (const char *) SchemaName,
-                                         (size_t) NameLength2);
+                                         (size_t) NameLength2,
+                                         stmt->Dbc);
                        if (sch == NULL)
                                goto nomem;
                }
                if (NameLength3 > 0) {
                        prc = ODBCParsePV("p", "name",
                                          (const char *) ProcName,
-                                         (size_t) NameLength3);
+                                         (size_t) NameLength3,
+                                         stmt->Dbc);
                        if (prc == NULL)
                                goto nomem;
                }
                if (NameLength4 > 0) {
                        col = ODBCParsePV("a", "name",
                                          (const char *) ColumnName,
-                                         (size_t) NameLength4);
+                                         (size_t) NameLength4,
+                                         stmt->Dbc);
                        if (col == NULL)
                                goto nomem;
                }
diff --git a/clients/odbc/driver/SQLProcedures.c 
b/clients/odbc/driver/SQLProcedures.c
--- a/clients/odbc/driver/SQLProcedures.c
+++ b/clients/odbc/driver/SQLProcedures.c
@@ -79,14 +79,16 @@ MNDBProcedures(ODBCStmt *stmt,
                if (NameLength2 > 0) {
                        sch = ODBCParsePV("s", "name",
                                          (const char *) SchemaName,
-                                         (size_t) NameLength2);
+                                         (size_t) NameLength2,
+                                         stmt->Dbc);
                        if (sch == NULL)
                                goto nomem;
                }
                if (NameLength3 > 0) {
                        pro = ODBCParsePV("p", "name",
                                          (const char *) ProcName,
-                                         (size_t) NameLength3);
+                                         (size_t) NameLength3,
+                                         stmt->Dbc);
                        if (pro == NULL)
                                goto nomem;
                }
diff --git a/clients/odbc/driver/SQLTablePrivileges.c 
b/clients/odbc/driver/SQLTablePrivileges.c
--- a/clients/odbc/driver/SQLTablePrivileges.c
+++ b/clients/odbc/driver/SQLTablePrivileges.c
@@ -66,14 +66,16 @@ MNDBTablePrivileges(ODBCStmt *stmt,
                if (NameLength2 > 0) {
                        sch = ODBCParsePV("s", "name",
                                          (const char *) SchemaName,
-                                         (size_t) NameLength2);
+                                         (size_t) NameLength2,
+                                         stmt->Dbc);
                        if (sch == NULL)
                                goto nomem;
                }
                if (NameLength3 > 0) {
                        tab = ODBCParsePV("t", "name",
                                          (const char *) TableName,
-                                         (size_t) NameLength3);
+                                         (size_t) NameLength3,
+                                         stmt->Dbc);
                        if (tab == NULL)
                                goto nomem;
                }
diff --git a/clients/odbc/driver/SQLTables.c b/clients/odbc/driver/SQLTables.c
--- a/clients/odbc/driver/SQLTables.c
+++ b/clients/odbc/driver/SQLTables.c
@@ -125,14 +125,16 @@ MNDBTables(ODBCStmt *stmt,
                        if (NameLength2 > 0) {
                                sch = ODBCParsePV("s", "name",
                                                  (const char *) SchemaName,
-                                                 (size_t) NameLength2);
+                                                 (size_t) NameLength2,
+                                                 stmt->Dbc);
                                if (sch == NULL)
                                        goto nomem;
                        }
                        if (NameLength3 > 0) {
                                tab = ODBCParsePV("t", "name",
                                                  (const char *) TableName,
-                                                 (size_t) NameLength3);
+                                                 (size_t) NameLength3,
+                                                 stmt->Dbc);
                                if (tab == NULL)
                                        goto nomem;
                        }
diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h
--- a/gdk/gdk_atoms.h
+++ b/gdk/gdk_atoms.h
@@ -132,7 +132,7 @@ gdk_export ssize_t fltFromStr(const char
 gdk_export ssize_t fltToStr(str *dst, size_t *len, const flt *src, bool 
external);
 gdk_export ssize_t dblFromStr(const char *src, size_t *len, dbl **dst, bool 
external);
 gdk_export ssize_t dblToStr(str *dst, size_t *len, const dbl *src, bool 
external);
-gdk_export ssize_t GDKstrFromStr(unsigned char *restrict dst, const unsigned 
char *restrict src, ssize_t len);
+gdk_export ssize_t GDKstrFromStr(unsigned char *restrict dst, const unsigned 
char *restrict src, ssize_t len, char quote);
 gdk_export ssize_t strFromStr(const char *restrict src, size_t *restrict len, 
str *restrict dst, bool external);
 gdk_export size_t escapedStrlen(const char *restrict src, const char *sep1, 
const char *sep2, int quote);
 gdk_export size_t escapedStr(char *restrict dst, const char *restrict src, 
size_t dstlen, const char *sep1, const char *sep2, int quote);
diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -333,7 +333,7 @@ strPut(BAT *b, var_t *dst, const void *V
 #endif
 
 ssize_t
-GDKstrFromStr(unsigned char *restrict dst, const unsigned char *restrict src, 
ssize_t len)
+GDKstrFromStr(unsigned char *restrict dst, const unsigned char *restrict src, 
ssize_t len, char quote)
 {
        unsigned char *p = dst;
        const unsigned char *cur = src, *end = src + len;
@@ -470,7 +470,6 @@ GDKstrFromStr(unsigned char *restrict ds
                } else if ((c = *cur) == '\\') {
                        escaped = true;
                        continue;
-#if 0
                } else if (c == quote && cur[1] == quote) {
                        assert(c != 0);
                        if (unlikely(n > 0))
@@ -478,7 +477,6 @@ GDKstrFromStr(unsigned char *restrict ds
                        *p++ = quote;
                        cur++;
                        continue;
-#endif
                }
 
                if (n > 0) {
@@ -598,7 +596,8 @@ strFromStr(const char *restrict src, siz
 
        return GDKstrFromStr((unsigned char *) *dst,
                             (const unsigned char *) start,
-                            (ssize_t) (cur - start));
+                            (ssize_t) (cur - start),
+                            '\0');
 }
 
 /*
diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -821,7 +821,7 @@ SQLinsert_val(READERtask *task, int col,
                        size_t slen = strlen(s) + 1;
                        char *data = slen <= sizeof(buf) ? buf : 
GDKmalloc(strlen(s) + 1);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to