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 -- [email protected]
To unsubscribe send an email to [email protected]