Changeset: cbbe10a4b78d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cbbe10a4b78d
Modified Files:
clients/mapiclient/dump.c
clients/mapiclient/msqldump.c
sql/backends/monet5/UDF/pyapi/conversion.c
sql/backends/monet5/UDF/pyapi/convert_loops.h
sql/backends/monet5/UDF/pyapi/pyapi.c
sql/backends/monet5/UDF/pyapi/pyloader.c
sql/backends/monet5/UDF/pyapi/pytypes.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_result.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_upgrades.c
Branch: default
Log Message:
Merge with Nov2019
diffs (truncated from 586 to 300 lines):
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -128,7 +128,17 @@ squoted_print(stream *f, const char *s,
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");
+ if (n > 0 && mnstr_write(f, s, 1, n) < 0)
+ return -1;
+ s += n;
switch (*s) {
+ case '\0':
+ continue;
case '\\':
if (mnstr_write(f, "\\\\", 1, 2) < 0)
return -1;
@@ -148,13 +158,8 @@ squoted_print(stream *f, const char *s,
return -1;
break;
default:
- if ((0 < *s && *s < 32) || *s == '\177') {
- if (mnstr_printf(f, "\\%03o", (uint8_t) *s) < 0)
- return -1;
- } else {
- if (mnstr_write(f, s, 1, 1) < 0)
- return -1;
- }
+ if (mnstr_printf(f, "\\%03o", (uint8_t) *s) < 0)
+ return -1;
break;
}
s++;
@@ -1783,14 +1788,13 @@ dump_table_data(Mapi mid, const char *sc
strcmp(tp, "url") == 0 ||
strcmp(tp, "uuid") == 0 ||
string[i])
- squoted_print(toConsole, s, useInserts
? '\'' : '"');
+ squoted_print(toConsole, s, '\'');
else
mnstr_printf(toConsole, "%s", s);
} else if (string[i]) {
- /* write double or single-quoted
- string with certain characters
- escaped */
- squoted_print(toConsole, s, useInserts ? '\'' :
'"');
+ /* write double-quoted string with
+ certain characters escaped */
+ squoted_print(toConsole, s, '"');
} else
mnstr_printf(toConsole, "%s", s);
diff --git a/clients/mapiclient/msqldump.c b/clients/mapiclient/msqldump.c
--- a/clients/mapiclient/msqldump.c
+++ b/clients/mapiclient/msqldump.c
@@ -190,7 +190,7 @@ main(int argc, char **argv)
fprintf(stderr, "%s", motd);
}
mapi_trace(mid, trace);
- mapi_cache_limit(mid, 10000);
+ mapi_cache_limit(mid, -1);
out = file_wastream(stdout, "stdout");
if (out == NULL) {
diff --git a/sql/backends/monet5/UDF/pyapi/conversion.c
b/sql/backends/monet5/UDF/pyapi/conversion.c
--- a/sql/backends/monet5/UDF/pyapi/conversion.c
+++ b/sql/backends/monet5/UDF/pyapi/conversion.c
@@ -37,6 +37,11 @@ static bool IsBlobType(int type)
return type == TYPE_blob;
}
+static bool IsVoidType(int type)
+{
+ return type == TYPE_void;
+}
+
PyObject *PyArrayObject_FromScalar(PyInput *inp, char **return_message)
{
PyObject *vararray = NULL;
@@ -44,6 +49,18 @@ PyObject *PyArrayObject_FromScalar(PyInp
assert(inp->scalar); // input has to be a scalar
switch (inp->bat_type) {
+ case TYPE_void:
+ vararray = PyArray_Arange(0, 1, 1,
+#if SIZEOF_OID == SIZEOF_INT
+
NPY_UINT
+#else
+
NPY_ULONGLONG
+#endif
+ );
+ break;
+ case TYPE_oid:
+ vararray = PyInt_FromLong((long)(*(oid *)inp->dataptr));
+ break;
case TYPE_bit:
vararray = PyInt_FromLong((long)(*(bit *)inp->dataptr));
break;
@@ -165,7 +182,7 @@ PyObject *PyArrayObject_FromBAT(PyInput
goto wrapup;
}
- if (!IsBlobType(inp->bat_type) &&
+ if (!IsVoidType(inp->bat_type) && !IsBlobType(inp->bat_type) &&
(!IsStandardBATType(inp->bat_type) ||
ConvertableSQLType(inp->sql_subtype))) { // if the sql type is
set, we
// have to do some conversion
@@ -205,6 +222,24 @@ PyObject *PyArrayObject_FromBAT(PyInput
}
} else {
switch (inp->bat_type) {
+ case TYPE_void:
+ BAT_TO_NP_CREATE_ALWAYS(b,
+#if SIZEOF_OID == SIZEOF_INT
+ NPY_UINT
+#else
+ NPY_ULONGLONG
+#endif
+ );
+ break;
+ case TYPE_oid:
+ BAT_TO_NP(b, oid,
+#if SIZEOF_OID == SIZEOF_INT
+ NPY_UINT32
+#else
+ NPY_UINT64
+#endif
+ );
+ break;
case TYPE_bit:
BAT_TO_NP(b, bit, NPY_INT8);
break;
@@ -927,6 +962,9 @@ BAT *PyObject_ConvertToBAT(PyReturn *ret
BATsettrivprop(b);
} else {
switch (bat_type) {
+ case TYPE_void:
+ NP_CREATE_EMPTY_BAT(b, oid);
+ break;
case TYPE_bit:
NP_CREATE_BAT(b, bit);
break;
diff --git a/sql/backends/monet5/UDF/pyapi/convert_loops.h
b/sql/backends/monet5/UDF/pyapi/convert_loops.h
--- a/sql/backends/monet5/UDF/pyapi/convert_loops.h
+++ b/sql/backends/monet5/UDF/pyapi/convert_loops.h
@@ -12,6 +12,9 @@
* these are in a separate header because they are used in multiple places
*/
+#define BAT_TO_NP_CREATE_ALWAYS(bat, nptpe)
\
+ vararray = PyArray_Arange(0, (double)bat->batCount, 1, nptpe);
+
#define BAT_TO_NP(bat, mtpe, nptpe)
\
if (copy) {
\
vararray = PyArray_EMPTY(1, elements, nptpe, 0);
\
@@ -561,6 +564,22 @@ convert_and_append(BAT* b, const char* t
#define NOT_HGE(mtpe) true
#endif
+#define NP_CREATE_EMPTY_BAT(bat, mtpe) \
+ { \
+ bat = COLnew(seqbase, TYPE_##mtpe, (BUN)ret->count, TRANSIENT);
\
+ if (bat == NULL) {
\
+ msg = createException(MAL, "pyapi.eval",
SQLSTATE(PY000) "Cannot create column"); \
+ goto wrapup;
\
+ }
\
+ bat->tkey = false;
\
+ bat->tsorted = false;
\
+ bat->trevsorted = false;
\
+ bat->tnil = false;
\
+ bat->tnonil = true;
\
+ BATsetcount(bat, (BUN)ret->count);
\
+ BATsettrivprop(bat);
\
+ }
+
// This very big #define combines all the previous #defines for one big #define
// that is responsible for converting a Numpy array (described in the PyReturn
// object 'ret')
diff --git a/sql/backends/monet5/UDF/pyapi/pyapi.c
b/sql/backends/monet5/UDF/pyapi/pyapi.c
--- a/sql/backends/monet5/UDF/pyapi/pyapi.c
+++ b/sql/backends/monet5/UDF/pyapi/pyapi.c
@@ -281,7 +281,7 @@ static str PyAPIeval(Client cntxt, MalBl
}
seqbase = b->hseqbase;
inp->count = BATcount(b);
- inp->bat_type = ATOMstorage(getBatType(getArgType(mb,
pci, i)));
+ inp->bat_type = b->ttype;
inp->bat = b;
if (inp->count == 0) {
// one of the input BATs is empty, don't
execute the function at
@@ -635,9 +635,10 @@ static str PyAPIeval(Client cntxt, MalBl
result_array = PyArrayObject_FromScalar(
&pyinput_values[i - (pci->retc + 2)], &msg);
} else {
+ int type = pyinput_values[i - (pci->retc + 2)].bat_type;
result_array = PyMaskedArray_FromBAT(
&pyinput_values[i - (pci->retc + 2)], t_start,
t_end, &msg,
- !enable_zerocopy_input);
+ !enable_zerocopy_input && type != TYPE_void);
}
if (result_array == NULL) {
if (msg == MAL_SUCCEED) {
@@ -756,6 +757,9 @@ static str PyAPIeval(Client cntxt, MalBl
if (!input.scalar) {
switch (input.bat_type) {
+ case TYPE_void:
+ NP_SPLIT_BAT(oid);
+ break;
case TYPE_bit:
NP_SPLIT_BAT(bit);
break;
@@ -1072,7 +1076,8 @@ static str PyAPIeval(Client cntxt, MalBl
// if someone has some problem with memory
size exploding when
// using PYTHON_MAP but it being fine in
regular PYTHON this
// is probably the issue
- int bat_type = getBatType(getArgType(mb, pci,
i));
+ PyInput *inp = &pyinput_values[i - (pci->retc +
2)];
+ int bat_type = inp->bat_type;
PyObject *new_array = PyArray_FromAny(
ret->numpy_array,
PyArray_DescrFromType(BatType_ToPyType(bat_type)), 1, 1,
@@ -1502,6 +1507,38 @@ static void ComputeParallelAggregation(A
} else {
npy_intp elements[1] = {group_elements};
switch (input.bat_type) {
+ case TYPE_void:
+ vararray = PyArray_New(
+ &PyArray_Type, 1,
elements,
+#if SIZEOF_OID == SIZEOF_INT
+ NPY_UINT
+#else
+ NPY_ULONGLONG
+#endif
+ ,
+ NULL,
+ ((oid
***)(*p->split_bats))[group_it][i], 0,
+ NPY_ARRAY_CARRAY ||
!NPY_ARRAY_WRITEABLE, NULL);
+ break;
+ case TYPE_oid:
+ vararray = PyArray_New(
+ &PyArray_Type, 1,
elements,
+#if SIZEOF_OID == SIZEOF_INT
+ NPY_UINT32
+#else
+ NPY_UINT64
+#endif
+ ,
+ NULL,
+ ((oid
***)(*p->split_bats))[group_it][i], 0,
+ NPY_ARRAY_CARRAY ||
!NPY_ARRAY_WRITEABLE, NULL);
+ break;
+ case TYPE_bit:
+ vararray = PyArray_New(
+ &PyArray_Type, 1,
elements, NPY_BOOL, NULL,
+ ((bit
***)(*p->split_bats))[group_it][i], 0,
+ NPY_ARRAY_CARRAY ||
!NPY_ARRAY_WRITEABLE, NULL);
+ break;
case TYPE_bte:
vararray = PyArray_New(
&PyArray_Type, 1,
elements, NPY_INT8, NULL,
diff --git a/sql/backends/monet5/UDF/pyapi/pyloader.c
b/sql/backends/monet5/UDF/pyapi/pyloader.c
--- a/sql/backends/monet5/UDF/pyapi/pyloader.c
+++ b/sql/backends/monet5/UDF/pyapi/pyloader.c
@@ -138,7 +138,7 @@ PYFUNCNAME(PyAPIevalLoader)(Client cntxt
}
inp.scalar = false;
inp.count = BATcount(b);
- inp.bat_type = ATOMstorage(getBatType(getArgType(mb,
pci, i)));
+ inp.bat_type = getBatType(getArgType(mb, pci, i));
inp.bat = b;
val = PyMaskedArray_FromBAT(
diff --git a/sql/backends/monet5/UDF/pyapi/pytypes.c
b/sql/backends/monet5/UDF/pyapi/pytypes.c
--- a/sql/backends/monet5/UDF/pyapi/pytypes.c
+++ b/sql/backends/monet5/UDF/pyapi/pytypes.c
@@ -113,6 +113,8 @@ char *BatType_Format(int type)
return "BLOB";
}
switch (type) {
+ case TYPE_void:
+ return "VOID";
case TYPE_bit:
return "BOOL";
case TYPE_bte:
@@ -157,12 +159,9 @@ int PyType_ToBat(int type)
#endif
case NPY_LONGLONG:
return TYPE_lng;
- case NPY_UBYTE:
- case NPY_USHORT:
- case NPY_UINT:
- case NPY_ULONG:
- case NPY_ULONGLONG:
- return TYPE_void;
+ case NPY_UINT32:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list