Changeset: ad1e7f4cf5d6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ad1e7f4cf5d6
Added Files:
sql/test/BugTracker-2020/Tests/global_table_propagation.Bug-6846.py
sql/test/BugTracker-2020/Tests/global_table_propagation.Bug-6846.stable.err
sql/test/BugTracker-2020/Tests/global_table_propagation.Bug-6846.stable.out
Modified Files:
clients/Tests/All
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/Tests/SingleServer
clients/mapiclient/mclient.1
gdk/gdk_bat.c
gdk/gdk_tracer.c
monetdb5/mal/mal.c
monetdb5/mal/mal_parser.c
monetdb5/modules/mal/tablet.c
monetdb5/optimizer/opt_pushselect.c
monetdb5/tools/Tests/mserver5--help.stable.err
monetdb5/tools/Tests/mserver5--help.stable.err.Windows
sql/ChangeLog.Jun2020
sql/backends/monet5/sql.c
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_result.c
sql/server/rel_schema.c
sql/server/sql_mvc.c
sql/server/sql_partition.c
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
sql/storage/store.c
sql/test/BugTracker-2018/Tests/nested-merge-tables.Bug-6585.stable.err
sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.py
sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.err
sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.out
sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.py
sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.err
sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.stable.out
sql/test/BugTracker-2020/Tests/All
sql/test/BugTracker-2020/Tests/alter-table-add-column.Bug-6816.py
sql/test/BugTracker-2020/Tests/alter-table-add-column.Bug-6816.stable.err
sql/test/BugTracker-2020/Tests/alter-table-add-column.Bug-6816.stable.out
sql/test/BugTracker-2020/Tests/functions-not-persist.Bug-6819.SQL.py
sql/test/BugTracker-2020/Tests/functions-not-persist.Bug-6819.stable.err
sql/test/BugTracker-2020/Tests/functions-not-persist.Bug-6819.stable.out
sql/test/merge-partitions/Tests/mergepart05.stable.err
sql/test/merge-partitions/Tests/mergepart07.stable.err
sql/test/mergetables/Tests/mergedropcrash.stable.err
sql/test/pg_regress/Tests/alter_table.stable.err
sql/test/pg_regress/Tests/drop.stable.err
tools/merovingian/client/monetdb.1
tools/merovingian/daemon/monetdbd.1.in
tools/mserver/mserver5.1.in
tools/mserver/mserver5.c
Branch: scoping
Log Message:
Merged with default
diffs (truncated from 2176 to 300 lines):
diff --git a/clients/Tests/All b/clients/Tests/All
--- a/clients/Tests/All
+++ b/clients/Tests/All
@@ -1,4 +1,4 @@
exports
-HAVE_FITS&HAVE_GEOM&HAVE_LIBR&HAVE_LIDAR&HAVE_NETCDF&HAVE_SHP?MAL-signatures
+HAVE_FITS&HAVE_GEOM&HAVE_LIBR&HAVE_LIBPY3&HAVE_LIDAR&HAVE_NETCDF&HAVE_SHP&NOT_WIN32?MAL-signatures
MERCURIAL?malcheck
mclient-uri
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -64,7 +64,7 @@ stdout of test 'MAL-signatures` in direc
% .%1, .%1, .%1, .%1, .%1 # table_name
% module, function, signature, address, comment # name
% clob, clob, clob, clob, clob # type
-% 10, 28, 364, 38, 874 # length
+% 12, 28, 364, 38, 874 # length
[ "aggr", "allnotequal", "command aggr.allnotequal(l:bat[:any_1],
r:bat[:any_1]):bit ", "SQLallnotequal;", "if all values in r are not
equal to l return true, else if r has nil nil else false" ]
[ "aggr", "anyequal", "pattern aggr.anyequal(l:any_1, r:any_1):bit ",
"CMDvarEQ;", "" ]
[ "aggr", "anyequal", "command aggr.anyequal(l:bat[:any_1],
r:bat[:any_1]):bit ", "SQLanyequal;", "if any value in r is equal to l
return true, else if r has nil nil else false" ]
@@ -11242,6 +11242,14 @@ stdout of test 'MAL-signatures` in direc
[ "batmtime", "year", "command batmtime.year(d:bat[:date]):bat[:int] ",
"MTIMEdate_extract_year_bulk;", "" ]
[ "batpcre", "replace", "command batpcre.replace(orig:bat[:str],
pat:str, repl:str, flag:str):bat[:str] ", "PCREreplace_bat_wrap;",
"" ]
[ "batpcre", "replace_first", "command
batpcre.replace_first(orig:bat[:str], pat:str, repl:str, flag:str):bat[:str] ",
"PCREreplacefirst_bat_wrap;", "" ]
+[ "batpyapi3", "eval", "unsafe pattern batpyapi3.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI3PyAPIevalStd;", "Execute a simple Python
script value" ]
+[ "batpyapi3", "eval_aggr", "unsafe pattern batpyapi3.eval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggr;", "grouped aggregates
through Python" ]
+[ "batpyapi3", "eval_loader", "unsafe pattern batpyapi3.eval_loader(fptr:ptr,
expr:str):any... ", "PYAPI3PyAPIevalLoader;", "loader functions
through Python" ]
+[ "batpyapi3", "eval_loader", "unsafe pattern batpyapi3.eval_loader(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalLoader;", "loader
functions through Python" ]
+[ "batpyapi3", "subeval_aggr", "unsafe pattern
batpyapi3.subeval_aggr(fptr:ptr, expr:str, arg:any...):any... ",
"PYAPI3PyAPIevalAggr;", "grouped aggregates through Python" ]
+[ "batpyapi3map", "eval", "pattern batpyapi3map.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI3PyAPIevalStdMap;", "Execute a simple
Python script value" ]
+[ "batpyapi3map", "eval_aggr", "pattern
batpyapi3map.eval_aggr(fptr:ptr, expr:str, arg:any...):any... ",
"PYAPI3PyAPIevalAggrMap;", "grouped aggregates through Python" ]
+[ "batpyapi3map", "subeval_aggr", "pattern
batpyapi3map.subeval_aggr(fptr:ptr, expr:str, arg:any...):any... ",
"PYAPI3PyAPIevalAggrMap;", "grouped aggregates through Python" ]
[ "batrapi", "eval", "pattern batrapi.eval(fptr:ptr, expr:str,
arg:any...):any... ", "RAPIevalStd;", "Execute a simple R script value" ]
[ "batrapi", "eval_aggr", "pattern batrapi.eval_aggr(fptr:ptr, expr:str,
arg:any...):any... ", "RAPIevalAggr;", "grouped aggregates through R"
]
[ "batrapi", "subeval_aggr", "pattern batrapi.subeval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "RAPIevalAggr;", "grouped aggregates
through R" ]
@@ -13949,6 +13957,17 @@ stdout of test 'MAL-signatures` in direc
[ "profiler", "starttrace", "pattern profiler.starttrace():void ",
"CMDstartTrace;", "Start collecting trace information" ]
[ "profiler", "stop", "pattern profiler.stop():void ",
"CMDstopProfiler;", "Stop offline performance profiling" ]
[ "profiler", "stoptrace", "pattern profiler.stoptrace():void ",
"CMDstopTrace;", "Stop collecting trace information" ]
+[ "pyapi3", "eval", "unsafe pattern pyapi3.eval(fptr:ptr, expr:str):any ",
"PYAPI3PyAPIevalStd;", "Execute a simple Python script returning a single
value" ]
+[ "pyapi3", "eval", "unsafe pattern pyapi3.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI3PyAPIevalStd;", "Execute a simple Python script
value" ]
+[ "pyapi3", "eval_aggr", "unsafe pattern pyapi3.eval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggr;", "grouped
aggregates through Python" ]
+[ "pyapi3", "eval_loader", "unsafe pattern pyapi3.eval_loader(fptr:ptr,
expr:str):any... ", "PYAPI3PyAPIevalLoader;", "loader functions
through Python" ]
+[ "pyapi3", "eval_loader", "unsafe pattern pyapi3.eval_loader(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalLoader;", "loader
functions through Python" ]
+[ "pyapi3", "prelude", "command pyapi3.prelude():void ",
"PYAPI3PyAPIprelude;", "" ]
+[ "pyapi3", "subeval_aggr", "unsafe pattern pyapi3.subeval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggr;", "grouped aggregates
through Python" ]
+[ "pyapi3map", "eval", "pattern pyapi3map.eval(fptr:ptr, expr:str):any ",
"PYAPI3PyAPIevalStdMap;", "Execute a simple Python script returning a
single value" ]
+[ "pyapi3map", "eval", "pattern pyapi3map.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI3PyAPIevalStdMap;", "Execute a simple
Python script value" ]
+[ "pyapi3map", "eval_aggr", "pattern pyapi3map.eval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggrMap;", "grouped
aggregates through Python" ]
+[ "pyapi3map", "subeval_aggr", "pattern pyapi3map.subeval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggrMap;", "grouped
aggregates through Python" ]
[ "querylog", "append", "pattern querylog.append(q:str, pipe:str,
usr:str, tick:timestamp):void ", "QLOGappend;", "Add a new query call to
the query log" ]
[ "querylog", "call", "pattern querylog.call(tick1:timestamp,
tick2:timestamp, arg:str, tuples:lng, xtime:lng, rtime:lng, cpu:int,
iowait:int):void ", "QLOGcall;", "Add a new query call to the query
log" ]
[ "querylog", "context", "command querylog.context(release:str,
version:str, revision:str, uri:str):void ", "QLOGcontextNaive;", "Noop
operation, just marking the query" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -68,7 +68,7 @@ stdout of test 'MAL-signatures` in direc
% .%1, .%1, .%1, .%1, .%1 # table_name
% module, function, signature, address, comment # name
% clob, clob, clob, clob, clob # type
-% 10, 28, 364, 38, 874 # length
+% 12, 28, 364, 38, 874 # length
[ "aggr", "allnotequal", "command aggr.allnotequal(l:bat[:any_1],
r:bat[:any_1]):bit ", "SQLallnotequal;", "if all values in r are not
equal to l return true, else if r has nil nil else false" ]
[ "aggr", "anyequal", "pattern aggr.anyequal(l:any_1, r:any_1):bit ",
"CMDvarEQ;", "" ]
[ "aggr", "anyequal", "command aggr.anyequal(l:bat[:any_1],
r:bat[:any_1]):bit ", "SQLanyequal;", "if any value in r is equal to l
return true, else if r has nil nil else false" ]
@@ -15997,6 +15997,14 @@ stdout of test 'MAL-signatures` in direc
[ "batmtime", "year", "command batmtime.year(d:bat[:date]):bat[:int] ",
"MTIMEdate_extract_year_bulk;", "" ]
[ "batpcre", "replace", "command batpcre.replace(orig:bat[:str],
pat:str, repl:str, flag:str):bat[:str] ", "PCREreplace_bat_wrap;",
"" ]
[ "batpcre", "replace_first", "command
batpcre.replace_first(orig:bat[:str], pat:str, repl:str, flag:str):bat[:str] ",
"PCREreplacefirst_bat_wrap;", "" ]
+[ "batpyapi3", "eval", "unsafe pattern batpyapi3.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI3PyAPIevalStd;", "Execute a simple Python
script value" ]
+[ "batpyapi3", "eval_aggr", "unsafe pattern batpyapi3.eval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggr;", "grouped aggregates
through Python" ]
+[ "batpyapi3", "eval_loader", "unsafe pattern batpyapi3.eval_loader(fptr:ptr,
expr:str):any... ", "PYAPI3PyAPIevalLoader;", "loader functions
through Python" ]
+[ "batpyapi3", "eval_loader", "unsafe pattern batpyapi3.eval_loader(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalLoader;", "loader
functions through Python" ]
+[ "batpyapi3", "subeval_aggr", "unsafe pattern
batpyapi3.subeval_aggr(fptr:ptr, expr:str, arg:any...):any... ",
"PYAPI3PyAPIevalAggr;", "grouped aggregates through Python" ]
+[ "batpyapi3map", "eval", "pattern batpyapi3map.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI3PyAPIevalStdMap;", "Execute a simple
Python script value" ]
+[ "batpyapi3map", "eval_aggr", "pattern
batpyapi3map.eval_aggr(fptr:ptr, expr:str, arg:any...):any... ",
"PYAPI3PyAPIevalAggrMap;", "grouped aggregates through Python" ]
+[ "batpyapi3map", "subeval_aggr", "pattern
batpyapi3map.subeval_aggr(fptr:ptr, expr:str, arg:any...):any... ",
"PYAPI3PyAPIevalAggrMap;", "grouped aggregates through Python" ]
[ "batrapi", "eval", "pattern batrapi.eval(fptr:ptr, expr:str,
arg:any...):any... ", "RAPIevalStd;", "Execute a simple R script value" ]
[ "batrapi", "eval_aggr", "pattern batrapi.eval_aggr(fptr:ptr, expr:str,
arg:any...):any... ", "RAPIevalAggr;", "grouped aggregates through R"
]
[ "batrapi", "subeval_aggr", "pattern batrapi.subeval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "RAPIevalAggr;", "grouped aggregates
through R" ]
@@ -19401,6 +19409,17 @@ stdout of test 'MAL-signatures` in direc
[ "profiler", "starttrace", "pattern profiler.starttrace():void ",
"CMDstartTrace;", "Start collecting trace information" ]
[ "profiler", "stop", "pattern profiler.stop():void ",
"CMDstopProfiler;", "Stop offline performance profiling" ]
[ "profiler", "stoptrace", "pattern profiler.stoptrace():void ",
"CMDstopTrace;", "Stop collecting trace information" ]
+[ "pyapi3", "eval", "unsafe pattern pyapi3.eval(fptr:ptr, expr:str):any ",
"PYAPI3PyAPIevalStd;", "Execute a simple Python script returning a single
value" ]
+[ "pyapi3", "eval", "unsafe pattern pyapi3.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI3PyAPIevalStd;", "Execute a simple Python script
value" ]
+[ "pyapi3", "eval_aggr", "unsafe pattern pyapi3.eval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggr;", "grouped
aggregates through Python" ]
+[ "pyapi3", "eval_loader", "unsafe pattern pyapi3.eval_loader(fptr:ptr,
expr:str):any... ", "PYAPI3PyAPIevalLoader;", "loader functions
through Python" ]
+[ "pyapi3", "eval_loader", "unsafe pattern pyapi3.eval_loader(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalLoader;", "loader
functions through Python" ]
+[ "pyapi3", "prelude", "command pyapi3.prelude():void ",
"PYAPI3PyAPIprelude;", "" ]
+[ "pyapi3", "subeval_aggr", "unsafe pattern pyapi3.subeval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggr;", "grouped aggregates
through Python" ]
+[ "pyapi3map", "eval", "pattern pyapi3map.eval(fptr:ptr, expr:str):any ",
"PYAPI3PyAPIevalStdMap;", "Execute a simple Python script returning a
single value" ]
+[ "pyapi3map", "eval", "pattern pyapi3map.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI3PyAPIevalStdMap;", "Execute a simple
Python script value" ]
+[ "pyapi3map", "eval_aggr", "pattern pyapi3map.eval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggrMap;", "grouped
aggregates through Python" ]
+[ "pyapi3map", "subeval_aggr", "pattern pyapi3map.subeval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI3PyAPIevalAggrMap;", "grouped
aggregates through Python" ]
[ "querylog", "append", "pattern querylog.append(q:str, pipe:str,
usr:str, tick:timestamp):void ", "QLOGappend;", "Add a new query call to
the query log" ]
[ "querylog", "call", "pattern querylog.call(tick1:timestamp,
tick2:timestamp, arg:str, tuples:lng, xtime:lng, rtime:lng, cpu:int,
iowait:int):void ", "QLOGcall;", "Add a new query call to the query
log" ]
[ "querylog", "context", "command querylog.context(release:str,
version:str, revision:str, uri:str):void ", "QLOGcontextNaive;", "Noop
operation, just marking the query" ]
diff --git a/clients/Tests/SingleServer b/clients/Tests/SingleServer
--- a/clients/Tests/SingleServer
+++ b/clients/Tests/SingleServer
@@ -1,2 +1,3 @@
---set embedded_py=2
+--set embedded_py=3
--set embedded_r=true
+--set embedded_c=true
diff --git a/clients/mapiclient/mclient.1 b/clients/mapiclient/mclient.1
--- a/clients/mapiclient/mclient.1
+++ b/clients/mapiclient/mclient.1
@@ -169,8 +169,12 @@ All timings are reported on stderr.
.br
\fBNote\fP that the client-measured wall-clock time is reported per query
\fBonly\fP when options \fB\-\-interactive\fP or \fB\-\-echo\fP are used,
-because only then does mclient send individual lines (statements) of the SQL
-script to the server. Otherwise, when mclient sends the SQL script in
+because only then does
+.I mclient
+send individual lines (statements) of the SQL
+script to the server. Otherwise, when
+.I mclient
+sends the SQL script in
large(r) batch(es), only the total wall-clock time per batch is measured and
reported. The server-measured detailed performance timings are always
measured and reported per query.
@@ -454,7 +458,9 @@ is the name of the database.
mclient \-d $db \-s \(dqCOPY INTO $table FROM '$file' USING DELIMITERS
',',E'\e\en','\e\(dq'\(dq
.PP
Efficiently import data from a CSV file into a table when the file is
-to be read by mclient (e.g. the server has no access to the file).
+to be read by
+.I mclient
+(e.g. the server has no access to the file).
.I $file
is the (absolute or relative) path name of the file,
.I $table
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2363,13 +2363,16 @@ BATassertProps(BAT *b)
BUN mask;
if ((hs = GDKzalloc(sizeof(Hash))) == NULL) {
- TRC_ERROR(BAT_, "Cannot allocate hash table\n");
+ TRC_WARNING(BAT_, "Cannot allocate hash
table\n");
goto abort_check;
}
if (snprintf(hs->heaplink.filename,
sizeof(hs->heaplink.filename), "%s.thshprpl%x", nme, (unsigned) THRgettid()) >=
(int) sizeof(hs->heaplink.filename) ||
snprintf(hs->heapbckt.filename,
sizeof(hs->heapbckt.filename), "%s.thshprpb%x", nme, (unsigned) THRgettid()) >=
(int) sizeof(hs->heapbckt.filename)) {
+ /* cannot happen, see comment in gdk.h
+ * about sizes near definition of
+ * BBPINIT */
GDKfree(hs);
- TRC_ERROR(BAT_, "Heap filename is too large\n");
+ TRC_CRITICAL(BAT_, "Heap filename is too
large\n");
goto abort_check;
}
if (ATOMsize(b->ttype) == 1)
@@ -2385,7 +2388,7 @@ BATassertProps(BAT *b)
HASHnew(hs, b->ttype, BUNlast(b),
mask, BUN_NONE, false) != GDK_SUCCEED) {
GDKfree(hs);
- TRC_ERROR(BAT_, "Cannot allocate hash table\n");
+ TRC_WARNING(BAT_, "Cannot allocate hash
table\n");
goto abort_check;
}
BATloop(b, p, q) {
diff --git a/gdk/gdk_tracer.c b/gdk/gdk_tracer.c
--- a/gdk/gdk_tracer.c
+++ b/gdk/gdk_tracer.c
@@ -104,14 +104,24 @@ static gdk_return
const char *trace_path;
trace_path = GDKgetenv("gdk_dbtrace");
- if (trace_path == NULL)
+ if (trace_path == NULL) {
trace_path = GDKgetenv("gdk_dbpath");
- if (trace_path == NULL) {
- active_tracer = stderr;
- return GDK_SUCCEED;
+ if (trace_path == NULL) {
+ active_tracer = stderr;
+ return GDK_SUCCEED;
+ }
+ if (strconcat_len(file_name, sizeof(file_name),
+ trace_path, DIR_SEP_STR, FILE_NAME, NULL)
+ >= sizeof(file_name)) {
+ goto too_long;
+ }
+ } else {
+ if (strcpy_len(file_name, trace_path, sizeof(file_name))
+ >= sizeof(file_name)) {
+ goto too_long;
+ }
}
- snprintf(file_name, sizeof(file_name), "%s%c%s", trace_path, DIR_SEP,
FILE_NAME);
active_tracer = fopen(file_name, "a");
if (active_tracer == NULL) {
@@ -122,6 +132,12 @@ static gdk_return
}
return GDK_SUCCEED;
+
+ too_long:
+ GDK_TRACER_EXCEPTION("path name for dbtrace file too long");
+ file_name[0] = 0; /* uninitialize */
+ active_tracer = stderr;
+ return GDK_FAIL;
}
diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -70,7 +70,7 @@ int mal_init(void){
#ifndef NDEBUG
mdbExit();
#endif
- TRC_ERROR(MAL_SERVER, "%s\n", err);
+ TRC_CRITICAL(MAL_SERVER, "%s\n", err);
freeException(err);
return -1;
}
diff --git a/monetdb5/mal/mal_parser.c b/monetdb5/mal/mal_parser.c
--- a/monetdb5/mal/mal_parser.c
+++ b/monetdb5/mal/mal_parser.c
@@ -1051,12 +1051,12 @@ parseInclude(Client cntxt)
s = loadLibrary(modnme, FALSE);
if (s) {
parseError(cntxt, s);
- GDKfree(s);
+ freeException(s);
return 0;
}
if ((s = malInclude(cntxt, modnme, 0))) {
parseError(cntxt, s);
- GDKfree(s);
+ freeException(s);
return 0;
}
return 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
@@ -1304,80 +1304,71 @@ SQLproducer(void *p)
goto reportlackofinput;
}
for (e = s; *e && e < end && cnt < task->maxrow;) {
- /* tokenize the record completely the format of the
input
- * should comply to the following grammar rule [
- * [[quote][[esc]char]*[quote]csep]*rsep]* where quote
is
- * a single user defined character within the quoted
- * fields a character may be escaped with a backslash
The
- * user should supply the correct number of fields.
- * In the first phase we simply break the lines at the
- * record boundary. */
+ /* tokenize the record completely
+ *
+ * The format of the input should comply to the
following
+ * grammar rule [
[[quote][[esc]char]*[quote]csep]*rsep]*
+ * where quote is a single user-defined character.
+ * Within the quoted fields a character may be escaped
+ * with a backslash. The correct number of fields
should
+ * be supplied. In the first phase we simply break the
+ * lines at the record boundary. */
int nutf = 0;
int m = 0;
bool bs = false;
char q = 0;
size_t i = 0;
while (*e) {
- /* check for correctly encoded UTF-8 */
- if (nutf > 0) {
- if ((*e & 0xC0) != 0x80)
- goto badutf8;
- if (m != 0 && (*e & m) == 0)
- goto badutf8;
- m = 0;
- nutf--;
- } else if ((*e & 0xE0) == 0xC0) {
- nutf = 1;
- if ((e[0] & 0x1E) == 0)
+ if (task->skip > 0) {
+ /* no interpretation of data we're
skipping, just
+ * look for newline */
+ if (*e == '\n')
+ break;
+ } else {
+ /* check for correctly encoded UTF-8 */
+ if (nutf > 0) {
+ if ((*e & 0xC0) != 0x80)
+ goto badutf8;
+ if (m != 0 && (*e & m) == 0)
+ goto badutf8;
+ m = 0;
+ nutf--;
+ } else if ((*e & 0xE0) == 0xC0) {
+ nutf = 1;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list