Changeset: fce8d8f2af30 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fce8d8f2af30
Modified Files:
clients/mapiclient/dump.c
testing/Mtest.py.in
testing/sqllogictest.py
Branch: default
Log Message:
Merge with Oct2020 branch.
diffs (truncated from 602 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
@@ -882,6 +882,34 @@ dump_column_definition(Mapi mid, stream
mnstr_printf(toConsole, "\t");
space = dquoted_print(toConsole, c_name, " ");
mnstr_printf(toConsole, "%*s", CAP(slen - space), "");
+ if (s != NULL && t != NULL &&
+ strcmp(c_type, "char") == 0 && strcmp(c_type_digits,
"0") == 0) {
+ /* if the number of characters is not specified (due to
a bug),
+ * calculate a size */
+ char *c = descape(c_name);
+ if (c != NULL) {
+ size_t qlen = strlen(c) + strlen(s) + strlen(t)
+ 64;
+ char *q = malloc(qlen);
+ if (q != NULL) {
+ snprintf(q, qlen, "SELECT
max(length(\"%s\")) FROM \"%s\".\"%s\"", c, s, t);
+ MapiHdl h = mapi_query(mid, q);
+ if (h != NULL) {
+ if (mapi_fetch_row(h) != 0) {
+ const char *d =
mapi_fetch_field(h, 0);
+ free(c_type_digits);
+ /* if NULL, i.e. no
non-NULL values, fill in 1 */
+ c_type_digits =
strdup(d ? d : "1");
+ fprintf(stderr,
"Warning: fixing size of CHAR column for %s of table %s.%s\n", c_name, schema,
tname);
+ }
+ mapi_close_handle(h);
+ }
+ free(q);
+ }
+ free(c);
+ }
+ if (c_type_digits == NULL)
+ goto bailout;
+ }
space = dump_type(mid, toConsole, c_type, c_type_digits,
c_type_scale, hashge);
if (strcmp(c_null, "false") == 0) {
mnstr_printf(toConsole, "%*s NOT NULL",
diff --git a/testing/Mtest.py.in b/testing/Mtest.py.in
--- a/testing/Mtest.py.in
+++ b/testing/Mtest.py.in
@@ -1278,6 +1278,8 @@ def PerformDir(env, testdir, testlist, B
if not env.get('NOCLEAN') and LogDBdir and
os.path.exists(LogDBdir):
try:
shutil.rmtree(LogDBdir)
+ except KeyboardInterrupt:
+ raise
except:
Warn("database '%s` exists, but destroying it failed;
skipping tests in '%s`!" % (TSTDB, TSTSRCDIR))
#TODO:
@@ -1302,6 +1304,8 @@ def PerformDir(env, testdir, testlist, B
return td, elem, max(FdOut, FdErr), interrupted
try:
z.extractall(LogDBdir)
+ except KeyboardInterrupt:
+ raise
except:
Warn("initial database '%s` cannot be extracted; skipping
tests in '%s`!" % (initdb, TSTSRCDIR))
#TODO:
@@ -1446,6 +1450,8 @@ def PerformDir(env, testdir, testlist, B
if testweb:
try:
os.removedirs(TSTTRGDIR)
+ except KeyboardInterrupt:
+ raise
except:
pass
@@ -1628,27 +1634,27 @@ def GetBitsAndModsAndThreads(env) :
cmd = splitcommand(env['exe']['MAL_Client'][1])
if procdebug:
print('GetBitsAndModsAndThreads: starting process "%s"
(inpipe, outpipe, errpipe)\n' % '" "'.join(cmd))
- clnt = process.Popen(cmd, stdin=process.PIPE, stdout=process.PIPE,
- stderr=process.PIPE, text=True)
- input = '''\
- c := mdb.modules();
- modsid := algebra.unique(c,nil:bat);
- mods := algebra.projection(modsid,c);
- s := "\\nModules: ";
- sep := "";
- barrier (h:oid,t:str) := iterator.new(mods);
- s := s + sep;
- s := s + "\'";
- s := s + t;
- s := s + "\'";
- sep := ",";
- redo (h:oid,t:str) := iterator.next(mods);
- exit h;
- s := s + "\\n";
- io.printf(s);
- '''
- ##module("NoModule");
- qOut, qErr = clnt.communicate(input=input)
+ with process.Popen(cmd, stdin=process.PIPE, stdout=process.PIPE,
+ stderr=process.PIPE, text=True) as clnt:
+ input = '''\
+ c := mdb.modules();
+ modsid := algebra.unique(c,nil:bat);
+ mods := algebra.projection(modsid,c);
+ s := "\\nModules: ";
+ sep := "";
+ barrier (h:oid,t:str) := iterator.new(mods);
+ s := s + sep;
+ s := s + "\'";
+ s := s + t;
+ s := s + "\'";
+ sep := ",";
+ redo (h:oid,t:str) := iterator.next(mods);
+ exit h;
+ s := s + "\\n";
+ io.printf(s);
+ '''
+ ##module("NoModule");
+ qOut, qErr = clnt.communicate(input=input)
proc.terminate()
sOut = proc.stdout.read()
sErr = proc.stderr.read()
@@ -2468,10 +2474,10 @@ def prompt() :
def getkids():
# return a dictionary with process IDs as key and a list of child
# processes as value
- p = process.Popen(['ps', '-lu', os.getenv('USER')],
- stdout=process.PIPE, stderr=process.PIPE,
- text=True)
- out, err = p.communicate()
+ with process.Popen(['ps', '-lu', os.getenv('USER')],
+ stdout=process.PIPE, stderr=process.PIPE,
+ text=True) as p:
+ out, err = p.communicate()
if err:
return {}
lines = out.split('\n')
@@ -2552,26 +2558,28 @@ def killProc(proc, outfile = None, cmd =
else:
cdb = None
if cdb:
- p = process.Popen([cdb, '-pv', '-p', str(proc.pid),
- '-y',
'%scache*;srv*http://msdl.microsoft.com/download/symbols' % sym, '-lines',
'-c', '~*kP;!locks;q'],
- stdout=process.PIPE, text=True)
- out, err = p.communicate()
+ with process.Popen([cdb, '-pv', '-p', str(proc.pid),
+ '-y',
'%scache*;srv*http://msdl.microsoft.com/download/symbols' % sym, '-lines',
'-c', '~*kP;!locks;q'],
+ stdout=process.PIPE, text=True) as p:
+ out, err = p.communicate()
else:
out = ''
else:
try:
- p = process.Popen(['pstack', str(proc.pid)], stdout=process.PIPE,
- text=True)
- try:
- # pstack (gdb) sometimes hangs when trying to get the
- # stack trace: kill it mercilessly if it does
- t = Timer(60, reallyKill, args = [p])
- t.start()
- except AttributeError:
- t = None
- out, err = p.communicate()
+ with process.Popen(['pstack', str(proc.pid)], stdout=process.PIPE,
+ text=True) as p:
+ try:
+ # pstack (gdb) sometimes hangs when trying to get the
+ # stack trace: kill it mercilessly if it does
+ t = Timer(60, reallyKill, args = [p])
+ t.start()
+ except AttributeError:
+ t = None
+ out, err = p.communicate()
if t is not None:
t.cancel()
+ except KeyboardInterrupt:
+ raise
except:
out = ''
if outfile is not None and out:
@@ -2588,10 +2596,10 @@ def killProc(proc, outfile = None, cmd =
elif os.name == 'nt':
if procdebug:
print('killProc: starting process "taskkill" "/F" "/T" "/PID"
"%s"\n' % str(proc.pid))
- p = process.Popen(['taskkill','/F','/T','/PID',str(proc.pid)],
- stdout=process.PIPE, stderr=process.PIPE,
- text=True)
- out, err = p.communicate()
+ with process.Popen(['taskkill','/F','/T','/PID',str(proc.pid)],
+ stdout=process.PIPE, stderr=process.PIPE,
+ text=True) as p:
+ out, err = p.communicate()
if procdebug:
print('killProc: process exited "taskkill" "/F" "/T" "/PID" "%s"
(%s)\n' % (str(proc.pid), proc.returncode))
proc.kill()
@@ -2710,25 +2718,25 @@ def RunIt(cmd, onechild, TestIn, TestOut
if procdebug:
print('RunIt: starting process "%s"\n' % '" "'.join(cmd))
setpgrp = True
- proc = process.Popen(cmd, stdin=TestIn, stdout=TestOut,
- stderr=TestErr, text=True)
- proc.killed = False
- proc.onechild = onechild
- t = Timer(TimeOut, killProc, args = [proc, TestErr, cmd])
- try:
- t.start()
- # since both stdout and stderr are redirected to files,
- # communicate will not return any useful data
- proc.communicate(input = TestInput)
- t.cancel()
- if procdebug:
- print('RunIt: process exited "%s" (%s)\n' % ('" "'.join(cmd),
proc.returncode))
- except KeyboardInterrupt:
- t.cancel()
- killProc(proc, TestErr, cmd)
- if procdebug:
- print('RunIt: process killed "%s"\n' % '" "'.join(cmd))
- raise
+ with process.Popen(cmd, stdin=TestIn, stdout=TestOut,
+ stderr=TestErr, text=True) as proc:
+ proc.killed = False
+ proc.onechild = onechild
+ t = Timer(TimeOut, killProc, args = [proc, TestErr, cmd])
+ try:
+ t.start()
+ # since both stdout and stderr are redirected to files,
+ # communicate will not return any useful data
+ proc.communicate(input = TestInput)
+ t.cancel()
+ if procdebug:
+ print('RunIt: process exited "%s" (%s)\n' % ('" "'.join(cmd),
proc.returncode))
+ except KeyboardInterrupt:
+ t.cancel()
+ killProc(proc, TestErr, cmd)
+ if procdebug:
+ print('RunIt: process killed "%s"\n' % '" "'.join(cmd))
+ raise
rc = returnCode(proc, TestErr)
if rc == 'interrupt':
raise KeyboardInterrupt
@@ -2939,12 +2947,16 @@ def DoIt(env, SERVER, CALL, TST, EXT, Te
port=int(env['MAPIPORT']),
database=TSTDB,
language=lang)
+ except KeyboardInterrupt:
+ raise
except:
returncode = 'error'
else:
if not os.path.exists(TST+'.reqtests'):
try:
sql.drop()
+ except KeyboardInterrupt:
+ raise
except:
pass
try:
@@ -3086,23 +3098,23 @@ def Check(command, input) :
if procdebug:
print('Check: starting process "%s" (inpipe,outpipe,errpipe)\n' % '"
"'.join(command))
setpgrp = True
- proc = process.Popen(command, stdin=process.PIPE, stdout=process.PIPE,
- stderr=process.PIPE, text=True)
- proc.killed = False
- proc.onechild = True
- t = Timer(float(par['TIMEOUT']), killProc, args = [proc])
- try:
- t.start()
- qOut, qErr = proc.communicate(input = input)
- t.cancel()
- if procdebug:
- print('Check: process exited "%s" (%s)\n' % ('" "'.join(command),
proc.returncode))
- except KeyboardInterrupt:
- t.cancel()
- killProc(proc)
- if procdebug:
- print('Check: process killed "%s"\n' % '" "'.join(command))
- raise
+ with process.Popen(command, stdin=process.PIPE, stdout=process.PIPE,
+ stderr=process.PIPE, text=True) as proc:
+ proc.killed = False
+ proc.onechild = True
+ t = Timer(float(par['TIMEOUT']), killProc, args = [proc])
+ try:
+ t.start()
+ qOut, qErr = proc.communicate(input = input)
+ t.cancel()
+ if procdebug:
+ print('Check: process exited "%s" (%s)\n' % ('"
"'.join(command), proc.returncode))
+ except KeyboardInterrupt:
+ t.cancel()
+ killProc(proc)
+ if procdebug:
+ print('Check: process killed "%s"\n' % '" "'.join(command))
+ raise
qOut = qOut.split('\n')
qErr = qErr.split('\n')
failed = False
@@ -3272,10 +3284,10 @@ if os.name == "nt":
r = re.compile('^Microsoft Windows (.*)\[Version
([0-9]+\.[0-9]+)([^\[0-9].*)\]$')
if procdebug:
print('starting process "cmd" "/c" "ver" (inpipe,outpipe)\n')
- proc = process.Popen('cmd /c ver', stdin=process.PIPE,
- stdout=process.PIPE, stderr=process.PIPE,
- text=True)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list