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