Changeset: 515eb9c5cb29 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/515eb9c5cb29
Modified Files:
        sql/backends/monet5/UDF/pyapi3/pyapi3.c
Branch: default
Log Message:

Merge with Sep2022 branch.


diffs (224 lines):

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
@@ -887,6 +887,11 @@ static struct convert {
 char *
 ODBCTranslateSQL(ODBCDbc *dbc, const SQLCHAR *query, size_t length, SQLULEN 
noscan)
 {
+       /* we only need to read limited amounts of data into these
+        * buffers (timestamp, interval, function name), so 128 bytes is
+        * plenty long enough */
+       char buf[128], buf2[128];
+
        if (noscan != SQL_NOSCAN_ON) {
                char *nquery;
                bool quoted = false, rawstring = false, dquoted = false;
@@ -926,93 +931,83 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                        if (query[i] != '{')
                                continue;
                        size_t n = 0;
-                       char *s;
-                       if (sscanf((const char *) query + i, "{ ts '%m[0-9:. 
-]' }%zn", &s, &n) >= 1 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ ts '%127[0-9:. 
-]' }%zn", buf, &n) >= 1 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
-                               size_t len = strlen(s) + strlen(rest);
+                               size_t len = strlen(buf) + strlen(rest);
                                nquery = malloc(i + len + 13);
                                snprintf(nquery, i + len + 13,
                                         "%.*sTIMESTAMP '%s'%s",
-                                        (int) i, query, s, rest);
-                               free(s);
+                                        (int) i, query, buf, rest);
                                free(rest);
                                return nquery;
                        }
-                       if (sscanf((const char *) query + i, "{ t '%m[0-9:]' 
}%zn", &s, &n) >= 1 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ t '%127[0-9:]' 
}%zn", buf, &n) >= 1 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
-                               size_t len = strlen(s) + strlen(rest);
+                               size_t len = strlen(buf) + strlen(rest);
                                nquery = malloc(i + len + 8);
                                snprintf(nquery, i + len + 8,
                                         "%.*sTIME '%s'%s",
-                                        (int) i, query, s, rest);
-                               free(s);
+                                        (int) i, query, buf, rest);
                                free(rest);
                                return nquery;
                        }
-                       if (sscanf((const char *) query + i, "{ d '%m[0-9-]' 
}%zn", &s, &n) >= 1 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ d '%127[0-9-]' 
}%zn", buf, &n) >= 1 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
-                               size_t len = strlen(s) + strlen(rest);
+                               size_t len = strlen(buf) + strlen(rest);
                                nquery = malloc(i + len + 8);
                                snprintf(nquery, i + len + 8,
                                         "%.*sDATE '%s'%s",
-                                        (int) i, query, s, rest);
-                               free(s);
+                                        (int) i, query, buf, rest);
                                free(rest);
                                return nquery;
                        }
-                       if (sscanf((const char *) query + i, "{ guid 
'%m[0-9a-fA-F-]' }%zn", &s, &n) >= 1 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ guid 
'%127[0-9a-fA-F-]' }%zn", buf, &n) >= 1 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
-                               size_t len = strlen(s) + strlen(rest);
+                               size_t len = strlen(buf) + strlen(rest);
                                nquery = malloc(i + len + 8);
                                snprintf(nquery, i + len + 8,
                                         "%.*sUUID '%s'%s",
-                                        (int) i, query, s, rest);
-                               free(s);
+                                        (int) i, query, buf, rest);
                                free(rest);
                                return nquery;
                        }
-                       if (sscanf((const char *) query + i, "{ escape '%m[^']' 
}%zn", &s, &n) >= 1 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ escape 
'%127[^']' }%zn", buf, &n) >= 1 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
-                               size_t len = strlen(s) + strlen(rest);
+                               size_t len = strlen(buf) + strlen(rest);
                                nquery = malloc(i + len + 10);
                                snprintf(nquery, i + len + 10,
                                         "%.*sESCAPE '%s'%s",
-                                        (int) i, query, s, rest);
-                               free(s);
+                                        (int) i, query, buf, rest);
                                free(rest);
                                return nquery;
                        }
-                       char *s2;
-                       if (sscanf((const char *) query + i, "{ interval 
'%m[^']' %m[a-zA-Z ] }%zn", &s, &s2, &n) >= 2 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ interval 
'%127[^']' %127[a-zA-Z ] }%zn", buf, buf2, &n) >= 2 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
-                               size_t len = strlen(s) + strlen(s2) + 
strlen(rest);
+                               size_t len = strlen(buf) + strlen(buf2) + 
strlen(rest);
                                nquery = malloc(i + len + 14);
                                snprintf(nquery, i + len + 14,
                                         "%.*sINTERVAL '%s' %s %s",
-                                        (int) i, query, s, s2, rest);
-                               free(s);
+                                        (int) i, query, buf, buf2, rest);
                                free(rest);
                                return nquery;
                        }
-                       if (sscanf((const char *) query + i, "{ interval + 
'%m[^']' %m[a-zA-Z ] }%zn", &s, &s2, &n) >= 2 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ interval + 
'%127[^']' %127[a-zA-Z ] }%zn", buf, buf2, &n) >= 2 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
-                               size_t len = strlen(s) + strlen(s2) + 
strlen(rest);
+                               size_t len = strlen(buf) + strlen(buf2) + 
strlen(rest);
                                nquery = malloc(i + len + 15);
                                snprintf(nquery, i + len + 15,
                                         "%.*sINTERVAL +'%s' %s %s",
-                                        (int) i, query, s, s2, rest);
-                               free(s);
+                                        (int) i, query, buf, buf2, rest);
                                free(rest);
                                return nquery;
                        }
-                       if (sscanf((const char *) query + i, "{ interval - 
'%m[^']' %m[a-zA-Z ] }%zn", &s, &s2, &n) >= 2 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ interval - 
'%127[^']' %127[a-zA-Z ] }%zn", buf, buf2, &n) >= 2 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
-                               size_t len = strlen(s) + strlen(s2) + 
strlen(rest);
+                               size_t len = strlen(buf) + strlen(buf2) + 
strlen(rest);
                                nquery = malloc(i + len + 15);
                                snprintf(nquery, i + len + 15,
                                         "%.*sINTERVAL -'%s' %s %s",
-                                        (int) i, query, s, s2, rest);
-                               free(s);
+                                        (int) i, query, buf, buf2, rest);
                                free(rest);
                                return nquery;
                        }
@@ -1114,7 +1109,7 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                free(rest);
                                continue;
                        }
-                       if (sscanf((const char *) query + i, "{ fn 
%m[a-zA-Z0-9_] ( %zn", &s, &n) >= 1 && n > 0) {
+                       if (sscanf((const char *) query + i, "{ fn 
%127[a-zA-Z0-9_] ( %zn", buf, &n) >= 1 && n > 0) {
                                char *rest = ODBCTranslateSQL(dbc, query + i + 
n, length - i - n, noscan);
                                size_t arglen = 0;
                                size_t lastarg = 0;
@@ -1188,7 +1183,7 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                                if (nparen != 0 || seenarg)
                                                        break;
                                                for (struct scalars *func = 
scalars; func->name; func++) {
-                                                       if 
(strcasecmp(func->name, s) == 0 && func->nargs == nargs) {
+                                                       if 
(strcasecmp(func->name, buf) == 0 && func->nargs == nargs) {
                                                                const char 
*repl = func->repl;
                                                                const char 
*repl2 = "";
                                                                const char 
*repl3 = "";
@@ -1196,7 +1191,6 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                                                const char *p2 
= ")";
                                                                const char 
*quote = "";
                                                                size_t repl3len 
= 0;
-                                                               free(s);
                                                                if (repl == 
NULL) {
                                                                        if 
(strcmp(func->name, "user") == 0) {
                                                                                
repl = dbc->uid;
@@ -1233,7 +1227,6 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                                seenarg = true;
                                        }
                                }
-                               free(s);
                                free(rest);
                                continue;
                        }
diff --git a/sql/backends/monet5/UDF/pyapi3/pyapi3.c 
b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
--- a/sql/backends/monet5/UDF/pyapi3/pyapi3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
@@ -1413,28 +1413,16 @@ PYAPI3PyAPIprelude(void) {
                PyObject *tmp;
 
                static_assert(PY_MAJOR_VERSION == 3, "Python 3.X required");
-#if PY_MINOR_VERSION >= 9
-               /* introduced in 3.8, we use it for 3.9 and later */
+#if PY_MINOR_VERSION >= 11
+               /* introduced in 3.8, we use it for 3.11 and later
+                * on Windows, this code does not work with 3.10, it needs more
+                * complex initialization */
                PyStatus status;
                PyConfig config;
-               wchar_t *pyhome = NULL;
 
-               /* first figure out where Python was installed */
-               PyConfig_InitIsolatedConfig(&config);
-               status = PyConfig_Read(&config);
-               if (!PyStatus_Exception(status))
-                       pyhome = wcsdup(config.prefix);
-               PyConfig_Clear(&config);
-               /* now really configure the Python subsystem, using the Python
-                * prefix directory as its home
-                * if we don't set config.home, sys.path will not be set
-                * correctly on Windows and initialization will fail */
                PyConfig_InitIsolatedConfig(&config);
                status = PyConfig_SetArgv(&config, 1, argv);
                if (!PyStatus_Exception(status))
-                       status = PyConfig_SetString(&config, &config.home, 
pyhome);
-               free(pyhome);
-               if (!PyStatus_Exception(status))
                        status = PyConfig_Read(&config);
                if (!PyStatus_Exception(status))
                        status = Py_InitializeFromConfig(&config);
diff --git a/tools/merovingian/client/Tests/monetdb_snapshot.py 
b/tools/merovingian/client/Tests/monetdb_snapshot.py
--- a/tools/merovingian/client/Tests/monetdb_snapshot.py
+++ b/tools/merovingian/client/Tests/monetdb_snapshot.py
@@ -2,7 +2,7 @@
 
 import locale
 import os
-import pipes
+import shlex
 import re
 import subprocess
 import sys
@@ -98,7 +98,7 @@ with Runner(False) as run:
 
         header('CUSTOM FILENAME')
         custom_name = os.path.join(m.snapdir, 'snap.tar')
-        qcustom_name = pipes.quote(custom_name)
+        qcustom_name = shlex.quote(custom_name)
         m.run_monetdb('snapshot', 'create', '-t', qcustom_name, 'foo1')
         assert os.path.exists(custom_name)
         note("""os.path.exists(custom_name)""")
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to