Changeset: 25993fc264b3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=25993fc264b3
Added Files:
        sql/backends/monet5/UDF/pyapi3/50_pyapi3.mal
        sql/backends/monet5/UDF/pyapi3/Makefile.ag
        sql/backends/monet5/UDF/pyapi3/Tests/All
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_00.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_00.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_00.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_01.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_01.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_01.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_02.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_02.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_02.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_03.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_03.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_03.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_04.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_04.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_04.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_05.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_05.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_05.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_06.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_06.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_06.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_07.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_07.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_07.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_09.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_09.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_09.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_10.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_10.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_10.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_11.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_11.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_11.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_12.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_12.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_12.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_13.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_13.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_13.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_15.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_16.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_16.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_16.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_17.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_17.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_17.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_18.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_18.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_18.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_19.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_19.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_19.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_20.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_20.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_20.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_21.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_21.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_21.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_23.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_23.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_23.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_24.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_24.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_24.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_25.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_25.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_25.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_26.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_26.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_26.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_27.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_27.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_27.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_28.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_28.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_28.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_29.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_29.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_29.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_30.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_30.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_30.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_31.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_31.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_31.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_32.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_32.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_32.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_01.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_01.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_01.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_02.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_02.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_02.stable.out
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_05.SQL.sh
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_05.stable.err
        sql/backends/monet5/UDF/pyapi3/Tests/pyloader3_05.stable.out
        sql/backends/monet5/UDF/pyapi3/connection3.c
        sql/backends/monet5/UDF/pyapi3/conversion3.c
        sql/backends/monet5/UDF/pyapi3/emit3.c
        sql/backends/monet5/UDF/pyapi3/formatinput3.c
        sql/backends/monet5/UDF/pyapi3/pyapi3.c
        sql/backends/monet5/UDF/pyapi3/pyapi3.mal
        sql/backends/monet5/UDF/pyapi3/pyloader3.c
        sql/backends/monet5/UDF/pyapi3/pytypes3.c
        sql/backends/monet5/UDF/pyapi3/type_conversion3.c
        sql/backends/monet5/UDF/pyapi3/unicode3.c
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        configure.ag
        debian/libmonetdb-stream8.install
        debian/libmonetdb13.install
        monetdb5/extras/Makefile.ag
        monetdb5/mal/mal_import.c
        monetdb5/mal/mal_linker.c
        monetdb5/mal/mal_parser.c
        monetdb5/optimizer/opt_mitosis.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_support.c
        sql/backends/monet5/UDF/Makefile.ag
        sql/backends/monet5/UDF/pyapi/Makefile.ag
        sql/backends/monet5/UDF/pyapi/connection.c
        sql/backends/monet5/UDF/pyapi/connection.h
        sql/backends/monet5/UDF/pyapi/formatinput.c
        sql/backends/monet5/UDF/pyapi/formatinput.h
        sql/backends/monet5/UDF/pyapi/pyapi.c
        sql/backends/monet5/UDF/pyapi/pyapi.h
        sql/backends/monet5/UDF/pyapi/pyapi.mal
        sql/backends/monet5/UDF/pyapi/pyheader.h
        sql/backends/monet5/UDF/pyapi/pyloader.c
        sql/backends/monet5/UDF/pyapi/pytypes.c
        sql/backends/monet5/UDF/pyapi/pytypes.h
        sql/backends/monet5/UDF/pyapi/type_conversion.c
        sql/backends/monet5/UDF/pyapi/type_conversion.h
        sql/backends/monet5/UDF/pyapi/unicode.c
        sql/backends/monet5/UDF/pyapi/unicode.h
        sql/backends/monet5/generator/Tests/generator04.stable.err
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/include/sql_catalog.h
        sql/server/rel_psm.c
        sql/server/sql_parser.y
        sql/test/Dependencies/Tests/Dependencies.stable.out.int128
        sql/test/pg_regress/Tests/without_oid.stable.out.oid32
        testing/Mtest.py.in
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/utils/properties.c
        tools/merovingian/utils/utils.c
Branch: default
Log Message:

Merge with python3udf.


diffs (truncated from 6939 to 300 lines):

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
@@ -6074,14 +6074,14 @@ Ready.
 [ "batmtime",  "seconds",      "command 
batmtime.seconds(d:bat[:daytime]):bat[:int] ", 
"MTIMEdaytime_extract_seconds_bulk;",   ""      ]
 [ "batmtime",  "sql_seconds",  "command 
batmtime.sql_seconds(d:bat[:daytime]):bat[:int] ",     
"MTIMEdaytime_extract_sql_seconds_bulk;",       ""      ]
 [ "batmtime",  "year", "command batmtime.year(d:bat[:date]):bat[:int] ",       
"MTIMEdate_extract_year_bulk;", ""      ]
-[ "batpyapi",  "eval", "pattern batpyapi.eval(fptr:ptr, expr:str, 
arg:any...):any... ",        "PyAPIevalStd;",        "Execute a simple Python 
script value"  ]
-[ "batpyapi",  "eval_aggr",    "pattern batpyapi.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PyAPIevalAggr;",       "grouped aggregates through 
Python"     ]
-[ "batpyapi",  "eval_loader",  "pattern batpyapi.eval_loader(fptr:ptr, 
expr:str):any... ",     "PyAPIevalLoader;",     "loader functions through 
Python"       ]
-[ "batpyapi",  "eval_loader",  "pattern batpyapi.eval_loader(fptr:ptr, 
expr:str, arg:any...):any... ", "PyAPIevalLoader;",     "loader functions 
through Python"       ]
-[ "batpyapi",  "subeval_aggr", "pattern batpyapi.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ",        "PyAPIevalAggr;",       "grouped 
aggregates through Python"     ]
-[ "batpyapimap",       "eval", "pattern batpyapimap.eval(fptr:ptr, expr:str, 
arg:any...):any... ",     "PyAPIevalStdMap;",     "Execute a simple Python 
script value"  ]
-[ "batpyapimap",       "eval_aggr",    "pattern 
batpyapimap.eval_aggr(fptr:ptr, expr:str, arg:any...):any... ",        
"PyAPIevalAggrMap;",    "grouped aggregates through Python"     ]
-[ "batpyapimap",       "subeval_aggr", "pattern 
batpyapimap.subeval_aggr(fptr:ptr, expr:str, arg:any...):any... ",     
"PyAPIevalAggrMap;",    "grouped aggregates through Python"     ]
+[ "batpyapi",  "eval", "pattern batpyapi.eval(fptr:ptr, expr:str, 
arg:any...):any... ",        "PYAPI2PyAPIevalStd;",  "Execute a simple Python 
script value"  ]
+[ "batpyapi",  "eval_aggr",    "pattern batpyapi.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PYAPI2PyAPIevalAggr;", "grouped aggregates through 
Python"     ]
+[ "batpyapi",  "eval_loader",  "pattern batpyapi.eval_loader(fptr:ptr, 
expr:str):any... ",     "PYAPI2PyAPIevalLoader;",       "loader functions 
through Python"       ]
+[ "batpyapi",  "eval_loader",  "pattern batpyapi.eval_loader(fptr:ptr, 
expr:str, arg:any...):any... ", "PYAPI2PyAPIevalLoader;",       "loader 
functions through Python"       ]
+[ "batpyapi",  "subeval_aggr", "pattern batpyapi.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ",        "PYAPI2PyAPIevalAggr;", "grouped 
aggregates through Python"     ]
+[ "batpyapimap",       "eval", "pattern batpyapimap.eval(fptr:ptr, expr:str, 
arg:any...):any... ",     "PYAPI2PyAPIevalStdMap;",       "Execute a simple 
Python script value"  ]
+[ "batpyapimap",       "eval_aggr",    "pattern 
batpyapimap.eval_aggr(fptr:ptr, expr:str, arg:any...):any... ",        
"PYAPI2PyAPIevalAggrMap;",      "grouped aggregates through Python"     ]
+[ "batpyapimap",       "subeval_aggr", "pattern 
batpyapimap.subeval_aggr(fptr:ptr, expr:str, arg:any...):any... ",     
"PYAPI2PyAPIevalAggrMap;",      "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"  ]
@@ -8216,17 +8216,17 @@ Ready.
 [ "profiler",  "stop", "pattern profiler.stop():void ",        
"CMDstopProfiler;",     "Stop offline performance profiling"    ]
 [ "profiler",  "stoptrace",    "command profiler.stoptrace():void ",   
"CMDstopTrace;",        "Stop collecting trace information"     ]
 [ "profiler",  "stoptrace",    "command profiler.stoptrace(path:str):void ",   
"CMDstopTracePath;",    "Stop collecting trace information"     ]
-[ "pyapi",     "eval", "pattern pyapi.eval(fptr:ptr, expr:str):any ",  
"PyAPIevalStd;",        "Execute a simple Python script returning a single 
value"       ]
-[ "pyapi",     "eval", "pattern pyapi.eval(fptr:ptr, expr:str, 
arg:any...):any... ",   "PyAPIevalStd;",        "Execute a simple Python script 
value"  ]
-[ "pyapi",     "eval_aggr",    "pattern pyapi.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",      "PyAPIevalAggr;",       "grouped aggregates through 
Python"     ]
-[ "pyapi",     "eval_loader",  "pattern pyapi.eval_loader(fptr:ptr, 
expr:str):any... ",        "PyAPIevalLoader;",     "loader functions through 
Python"       ]
-[ "pyapi",     "eval_loader",  "pattern pyapi.eval_loader(fptr:ptr, expr:str, 
arg:any...):any... ",    "PyAPIevalLoader;",     "loader functions through 
Python"       ]
-[ "pyapi",     "prelude",      "command pyapi.prelude():void ",        
"PyAPIprelude;",        ""      ]
-[ "pyapi",     "subeval_aggr", "pattern pyapi.subeval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PyAPIevalAggr;",       "grouped aggregates through 
Python"     ]
-[ "pyapimap",  "eval", "pattern pyapimap.eval(fptr:ptr, expr:str):any ",       
"PyAPIevalStdMap;",     "Execute a simple Python script returning a single 
value"       ]
-[ "pyapimap",  "eval", "pattern pyapimap.eval(fptr:ptr, expr:str, 
arg:any...):any... ",        "PyAPIevalStdMap;",     "Execute a simple Python 
script value"  ]
-[ "pyapimap",  "eval_aggr",    "pattern pyapimap.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PyAPIevalAggrMap;",    "grouped aggregates through 
Python"     ]
-[ "pyapimap",  "subeval_aggr", "pattern pyapimap.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ",        "PyAPIevalAggrMap;",    "grouped 
aggregates through Python"     ]
+[ "pyapi",     "eval", "pattern pyapi.eval(fptr:ptr, expr:str):any ",  
"PYAPI2PyAPIevalStd;",  "Execute a simple Python script returning a single 
value"       ]
+[ "pyapi",     "eval", "pattern pyapi.eval(fptr:ptr, expr:str, 
arg:any...):any... ",   "PYAPI2PyAPIevalStd;",  "Execute a simple Python script 
value"  ]
+[ "pyapi",     "eval_aggr",    "pattern pyapi.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",      "PYAPI2PyAPIevalAggr;", "grouped aggregates through 
Python"     ]
+[ "pyapi",     "eval_loader",  "pattern pyapi.eval_loader(fptr:ptr, 
expr:str):any... ",        "PYAPI2PyAPIevalLoader;",       "loader functions 
through Python"       ]
+[ "pyapi",     "eval_loader",  "pattern pyapi.eval_loader(fptr:ptr, expr:str, 
arg:any...):any... ",    "PYAPI2PyAPIevalLoader;",       "loader functions 
through Python"       ]
+[ "pyapi",     "prelude",      "command pyapi.prelude():void ",        
"PYAPI2PyAPIprelude;",  ""      ]
+[ "pyapi",     "subeval_aggr", "pattern pyapi.subeval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PYAPI2PyAPIevalAggr;", "grouped aggregates through 
Python"     ]
+[ "pyapimap",  "eval", "pattern pyapimap.eval(fptr:ptr, expr:str):any ",       
"PYAPI2PyAPIevalStdMap;",       "Execute a simple Python script returning a 
single value"       ]
+[ "pyapimap",  "eval", "pattern pyapimap.eval(fptr:ptr, expr:str, 
arg:any...):any... ",        "PYAPI2PyAPIevalStdMap;",       "Execute a simple 
Python script value"  ]
+[ "pyapimap",  "eval_aggr",    "pattern pyapimap.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PYAPI2PyAPIevalAggrMap;",      "grouped aggregates 
through Python"     ]
+[ "pyapimap",  "subeval_aggr", "pattern pyapimap.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ",        "PYAPI2PyAPIevalAggrMap;",      "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",  "define",       "command querylog.define(q:str, pipe:str, 
size:int):void ",     "QLOGdefineNaive;",     "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
@@ -8040,14 +8040,14 @@ Ready.
 [ "batmtime",  "seconds",      "command 
batmtime.seconds(d:bat[:daytime]):bat[:int] ", 
"MTIMEdaytime_extract_seconds_bulk;",   ""      ]
 [ "batmtime",  "sql_seconds",  "command 
batmtime.sql_seconds(d:bat[:daytime]):bat[:int] ",     
"MTIMEdaytime_extract_sql_seconds_bulk;",       ""      ]
 [ "batmtime",  "year", "command batmtime.year(d:bat[:date]):bat[:int] ",       
"MTIMEdate_extract_year_bulk;", ""      ]
-[ "batpyapi",  "eval", "pattern batpyapi.eval(fptr:ptr, expr:str, 
arg:any...):any... ",        "PyAPIevalStd;",        "Execute a simple Python 
script value"  ]
-[ "batpyapi",  "eval_aggr",    "pattern batpyapi.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PyAPIevalAggr;",       "grouped aggregates through 
Python"     ]
-[ "batpyapi",  "eval_loader",  "pattern batpyapi.eval_loader(fptr:ptr, 
expr:str):any... ",     "PyAPIevalLoader;",     "loader functions through 
Python"       ]
-[ "batpyapi",  "eval_loader",  "pattern batpyapi.eval_loader(fptr:ptr, 
expr:str, arg:any...):any... ", "PyAPIevalLoader;",     "loader functions 
through Python"       ]
-[ "batpyapi",  "subeval_aggr", "pattern batpyapi.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ",        "PyAPIevalAggr;",       "grouped 
aggregates through Python"     ]
-[ "batpyapimap",       "eval", "pattern batpyapimap.eval(fptr:ptr, expr:str, 
arg:any...):any... ",     "PyAPIevalStdMap;",     "Execute a simple Python 
script value"  ]
-[ "batpyapimap",       "eval_aggr",    "pattern 
batpyapimap.eval_aggr(fptr:ptr, expr:str, arg:any...):any... ",        
"PyAPIevalAggrMap;",    "grouped aggregates through Python"     ]
-[ "batpyapimap",       "subeval_aggr", "pattern 
batpyapimap.subeval_aggr(fptr:ptr, expr:str, arg:any...):any... ",     
"PyAPIevalAggrMap;",    "grouped aggregates through Python"     ]
+[ "batpyapi",  "eval", "pattern batpyapi.eval(fptr:ptr, expr:str, 
arg:any...):any... ",        "PYAPI2PyAPIevalStd;",  "Execute a simple Python 
script value"  ]
+[ "batpyapi",  "eval_aggr",    "pattern batpyapi.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PYAPI2PyAPIevalAggr;", "grouped aggregates through 
Python"     ]
+[ "batpyapi",  "eval_loader",  "pattern batpyapi.eval_loader(fptr:ptr, 
expr:str):any... ",     "PYAPI2PyAPIevalLoader;",       "loader functions 
through Python"       ]
+[ "batpyapi",  "eval_loader",  "pattern batpyapi.eval_loader(fptr:ptr, 
expr:str, arg:any...):any... ", "PYAPI2PyAPIevalLoader;",       "loader 
functions through Python"       ]
+[ "batpyapi",  "subeval_aggr", "pattern batpyapi.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ",        "PYAPI2PyAPIevalAggr;", "grouped 
aggregates through Python"     ]
+[ "batpyapimap",       "eval", "pattern batpyapimap.eval(fptr:ptr, expr:str, 
arg:any...):any... ",     "PYAPI2PyAPIevalStdMap;",       "Execute a simple 
Python script value"  ]
+[ "batpyapimap",       "eval_aggr",    "pattern 
batpyapimap.eval_aggr(fptr:ptr, expr:str, arg:any...):any... ",        
"PYAPI2PyAPIevalAggrMap;",      "grouped aggregates through Python"     ]
+[ "batpyapimap",       "subeval_aggr", "pattern 
batpyapimap.subeval_aggr(fptr:ptr, expr:str, arg:any...):any... ",     
"PYAPI2PyAPIevalAggrMap;",      "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"  ]
@@ -10578,17 +10578,17 @@ Ready.
 [ "profiler",  "stop", "pattern profiler.stop():void ",        
"CMDstopProfiler;",     "Stop offline performance profiling"    ]
 [ "profiler",  "stoptrace",    "command profiler.stoptrace():void ",   
"CMDstopTrace;",        "Stop collecting trace information"     ]
 [ "profiler",  "stoptrace",    "command profiler.stoptrace(path:str):void ",   
"CMDstopTracePath;",    "Stop collecting trace information"     ]
-[ "pyapi",     "eval", "pattern pyapi.eval(fptr:ptr, expr:str):any ",  
"PyAPIevalStd;",        "Execute a simple Python script returning a single 
value"       ]
-[ "pyapi",     "eval", "pattern pyapi.eval(fptr:ptr, expr:str, 
arg:any...):any... ",   "PyAPIevalStd;",        "Execute a simple Python script 
value"  ]
-[ "pyapi",     "eval_aggr",    "pattern pyapi.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",      "PyAPIevalAggr;",       "grouped aggregates through 
Python"     ]
-[ "pyapi",     "eval_loader",  "pattern pyapi.eval_loader(fptr:ptr, 
expr:str):any... ",        "PyAPIevalLoader;",     "loader functions through 
Python"       ]
-[ "pyapi",     "eval_loader",  "pattern pyapi.eval_loader(fptr:ptr, expr:str, 
arg:any...):any... ",    "PyAPIevalLoader;",     "loader functions through 
Python"       ]
-[ "pyapi",     "prelude",      "command pyapi.prelude():void ",        
"PyAPIprelude;",        ""      ]
-[ "pyapi",     "subeval_aggr", "pattern pyapi.subeval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PyAPIevalAggr;",       "grouped aggregates through 
Python"     ]
-[ "pyapimap",  "eval", "pattern pyapimap.eval(fptr:ptr, expr:str):any ",       
"PyAPIevalStdMap;",     "Execute a simple Python script returning a single 
value"       ]
-[ "pyapimap",  "eval", "pattern pyapimap.eval(fptr:ptr, expr:str, 
arg:any...):any... ",        "PyAPIevalStdMap;",     "Execute a simple Python 
script value"  ]
-[ "pyapimap",  "eval_aggr",    "pattern pyapimap.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PyAPIevalAggrMap;",    "grouped aggregates through 
Python"     ]
-[ "pyapimap",  "subeval_aggr", "pattern pyapimap.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ",        "PyAPIevalAggrMap;",    "grouped 
aggregates through Python"     ]
+[ "pyapi",     "eval", "pattern pyapi.eval(fptr:ptr, expr:str):any ",  
"PYAPI2PyAPIevalStd;",  "Execute a simple Python script returning a single 
value"       ]
+[ "pyapi",     "eval", "pattern pyapi.eval(fptr:ptr, expr:str, 
arg:any...):any... ",   "PYAPI2PyAPIevalStd;",  "Execute a simple Python script 
value"  ]
+[ "pyapi",     "eval_aggr",    "pattern pyapi.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",      "PYAPI2PyAPIevalAggr;", "grouped aggregates through 
Python"     ]
+[ "pyapi",     "eval_loader",  "pattern pyapi.eval_loader(fptr:ptr, 
expr:str):any... ",        "PYAPI2PyAPIevalLoader;",       "loader functions 
through Python"       ]
+[ "pyapi",     "eval_loader",  "pattern pyapi.eval_loader(fptr:ptr, expr:str, 
arg:any...):any... ",    "PYAPI2PyAPIevalLoader;",       "loader functions 
through Python"       ]
+[ "pyapi",     "prelude",      "command pyapi.prelude():void ",        
"PYAPI2PyAPIprelude;",  ""      ]
+[ "pyapi",     "subeval_aggr", "pattern pyapi.subeval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PYAPI2PyAPIevalAggr;", "grouped aggregates through 
Python"     ]
+[ "pyapimap",  "eval", "pattern pyapimap.eval(fptr:ptr, expr:str):any ",       
"PYAPI2PyAPIevalStdMap;",       "Execute a simple Python script returning a 
single value"       ]
+[ "pyapimap",  "eval", "pattern pyapimap.eval(fptr:ptr, expr:str, 
arg:any...):any... ",        "PYAPI2PyAPIevalStdMap;",       "Execute a simple 
Python script value"  ]
+[ "pyapimap",  "eval_aggr",    "pattern pyapimap.eval_aggr(fptr:ptr, expr:str, 
arg:any...):any... ",   "PYAPI2PyAPIevalAggrMap;",      "grouped aggregates 
through Python"     ]
+[ "pyapimap",  "subeval_aggr", "pattern pyapimap.subeval_aggr(fptr:ptr, 
expr:str, arg:any...):any... ",        "PYAPI2PyAPIevalAggrMap;",      "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",  "define",       "command querylog.define(q:str, pipe:str, 
size:int):void ",     "QLOGdefineNaive;",     "Noop operation, just marking the 
query"        ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1937,6 +1937,7 @@ str batcalcRef;
 str batmalRef;
 str batmmathRef;
 str batmtimeRef;
+str batpyapi3Ref;
 str batpyapiRef;
 str batrapiRef;
 str batsqlRef;
@@ -2399,6 +2400,8 @@ InstrPtr pushZero(MalBlkPtr mb, InstrPtr
 str putName(const char *nme);
 str putNameLen(const char *nme, size_t len);
 str putRef;
+str pyapi3Ref;
+str pyapi3mapRef;
 str pyapiRef;
 str pyapimapRef;
 int qtop;
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -289,10 +289,17 @@ AC_ARG_ENABLE([rintegration],
 dft_pyintegration=auto
 AC_ARG_ENABLE([pyintegration],
        [AS_HELP_STRING([--enable-pyintegration],
-               [enable support for Python integration into MonetDB 
(default=auto)])],
+               [enable support for Python 2 integration into MonetDB 
(default=auto)])],
        [enable_pyintegration=$enableval],
        [enable_pyintegration=$dft_pyintegration])
 
+dft_py3integration=auto
+AC_ARG_ENABLE(py3integration,
+       AS_HELP_STRING([--enable-py3integration],
+               [enable support for Python 3 integration into MonetDB 
(default=auto)]),
+       enable_py3integration=$enableval,
+       enable_py3integration=$dft_py3integration)
+
 # The console is a direct client hooked onto the kernel with full
 # administrative privileges, bypassing any security checks.  It is
 # handy only during development.
@@ -1112,13 +1119,13 @@ AS_CASE([$have_python3],
        [
                PYTHON3="$have_python3"])
 
-AC_ARG_WITH([pyconfig],
-       [AS_HELP_STRING([--with-pyconfig=FILE], [python-config is installed as 
FILE])],
-       [have_pyconfig="$withval"])
+AC_ARG_WITH([py2config],
+       [AS_HELP_STRING([--with-py2config=FILE], [python2-config is installed 
as FILE])],
+       [have_py2config="$withval"])
 
-AC_ARG_WITH([pyversion],
-       [AS_HELP_STRING([--with-pyversion=FILE], [python is installed as 
FILE])],
-       [have_pyversion="$withval"])
+AC_ARG_WITH(py3config,
+       AS_HELP_STRING([--with-py3config=FILE], [python3-config is installed as 
FILE]),
+       have_py3config="$withval")
 
 # Figure out a default for PYTHON2 or PYTHON3
 AC_PATH_PROG([PYTHON], [python], [no], [$PATH])
@@ -1848,24 +1855,22 @@ AS_VAR_IF([enable_pyintegration], [no], 
                [/*], [XPATH="$enable_pyintegration"
                       enable_pyintegration=yes],
                [AC_MSG_ERROR([--enable-pyintegration value must be 
yes|no|auto|absolute path of python-config])])
-       AS_VAR_IF([have_pyconfig], [], [
-               AC_PATH_PROG([PYCMD], [python2-config], [no], [$PATH])
-               AS_VAR_IF([PYCMD], [no], [
+       AS_VAR_IF([have_py2config], [], [
+               AC_PATH_PROG([PY2CONFIG], [python2-config], [no], [$PATH])
+               AS_VAR_IF([PY2CONFIG], [no], [
                        AC_PATH_PROG([PYCMD2], [python-config], [no], [$PATH])
                        AS_VAR_IF([PYCMD2], [no], [
                                AS_VAR_IF([enable_pyintegration], [yes],
-                               [AC_MSG_ERROR([python-config library required 
for Python integration support])],
+                               [AC_MSG_ERROR([python2-config library required 
for Python integration support])],
                                [have_libpy="no"
-                               why_have_libpy="(python-config command not 
found)"
+                               why_have_libpy="(python2-config command not 
found)"
                                enable_pyintegration="no"
-                               disable_pyintegration="(python-config command 
not found)"
+                               disable_pyintegration="(python2-config command 
not found)"
                                ])
-                       ], [PYCMD="$PYCMD2"])
+                       ], [PY2CONFIG="$PYCMD2"])
                ], [])
-       ], [PYCMD="$have_pyconfig"])
-       AS_VAR_IF([have_pyversion], [],
-               [PYTHON_CMD=$PYTHON2],
-               [PYTHON_CMD=$have_pyversion])
+       ], [PY2CONFIG="$have_py2config"])
+       PYTHON_CMD=$PYTHON2
        NUMPYVER=`$PYTHON_CMD -c "import numpy; 
print(int(numpy.__version__.split('.').__getitem__(1)) >= 7)"`
        # check numpyconfig.h because autoconf tests includes by
        # compiling a small C program, and other numpy headers do
@@ -1888,7 +1893,7 @@ AS_VAR_IF([enable_pyintegration], [no], 
                         enable_pyintegration="no"
                         disable_pyintegration="(numpy/arrayobject.h not 
found)"])],
                [libpy_CFLAGS=`$PYTHON_CMD -c "from distutils.sysconfig import 
get_python_inc; import numpy; print(' -I' + get_python_inc() + ' -I' + 
numpy.get_include());"`
-                libpy_LIBS=`$PYCMD --ldflags`
+                libpy_LIBS=`$PY2CONFIG --ldflags`
                 HAVEPYTHONHEADER=`$PYTHON_CMD -c "import distutils.sysconfig, 
os; print(os.path.isfile(os.path.join(distutils.sysconfig.get_python_inc(), 
'Python.h')))"`
                 AS_VAR_IF([HAVEPYTHONHEADER], [True],
                        [have_libpy=yes
@@ -1903,6 +1908,90 @@ AS_VAR_IF([enable_pyintegration], [no], 
                                 disable_pyintegration="Python.h not 
found"])])])])
 AM_CONDITIONAL([HAVE_LIBPY], [test x"$have_libpy" != xno])
 
+
+# Python 3 UDFs
+have_libpy3=no
+if test "x$enable_py3integration" != xno; then
+       case "$enable_py3integration" in
+       yes|auto)
+               XPATH="$PATH"
+               ;;
+       /*)
+               XPATH="$enable_py3integration"
+               enable_py3integration=yes
+               ;;
+       *)
+               AC_MSG_ERROR([--enable-py3integration value must be 
yes|no|auto|absolute path of python-config])
+               ;;
+       esac
+       if test "x$have_py3config" = x; then
+               # for some god forsaken reason autoconf thinks python2-config 
and python3-config are the same program, so we have to explicitly tell it not 
to select python2-config when we want python3-config
+               AC_PATH_PROG(PY3CONFIG,python3-config,,$XPATH,$PY2CONFIG)
+               if test "x$PY3CONFIG" = x; then
+                       if test "x$enable_py3integration" = xyes; then
+                               AC_MSG_ERROR([python3-config required for 
Python3 integration support])
+                       else
+                               have_libpy3="no"
+                               why_have_libpy3="(python3-config command not 
found)"
+                               enable_py3integration=no
+                               disable_py3integration="(python3-config command 
not found)"
+                       fi
+               fi
+       else
+               PY3CONFIG="$have_py3config"
+       fi
+
+       PYTHON_CMD=$PYTHON3
+
+       NUMPYVER=`$PYTHON_CMD -c "import numpy; 
print(int(numpy.__version__.split('.').__getitem__(1)) >= 7)"`
+       # check numpyconfig.h because autoconf tests includes by compiling a 
small C program, and other numpy headers do not compile without Python.h
+       AC_CHECK_HEADER(
+           [numpy/numpyconfig.h], 
+               [NUMPYHEADERS=True],
+               [NUMPYHEADERS=`$PYTHON_CMD -c "import numpy, os; 
print(os.path.isfile(os.path.join(numpy.get_include(), 
'numpy/arrayobject.h')))"`]
+               )
+       if [test "x$NUMPYVER" = x] || [test "x$NUMPYVER" = xFalse]; then
+               if test "x$enable_py3integration" = xyes; then
+                       AC_MSG_ERROR([numpy version >= 1.7.0 required for 
Python3 integration support])
+               else
+                       have_libpy3="no"
+                       why_have_libpy3="(numpy version >= 1.7.0 not found)"
+                       enable_py3integration=no
+                       disable_py3integration="(numpy version >= 1.7.0 not 
found)"
+               fi
+       elif [test "x$NUMPYHEADERS" = xFalse ]; then
+               if test "x$enable_py3integration" = xyes; then
+                       AC_MSG_ERROR([numpy/arrayobject.h not found])
+               else
+                       have_libpy3="no"
+                       why_have_libpy3="(numpy/arrayobject.h not found)"
+                       enable_py3integration=no
+                       disable_py3integration="(numpy/arrayobject.h not found)"
+               fi
+       else
+               libpy3_CFLAGS=`$PYTHON_CMD -c "from distutils.sysconfig import 
get_python_inc; import numpy; print(' -I' + get_python_inc() + ' -I' + 
numpy.get_include());"`
+               libpy3_LIBS=`$PY3CONFIG --ldflags`
+               HAVEPYTHONHEADER=`$PYTHON_CMD -c "import distutils.sysconfig, 
os; print(os.path.isfile(os.path.join(distutils.sysconfig.get_python_inc(), 
'Python.h')))"`
+               if [test "x$HAVEPYTHONHEADER" = xTrue]; then
+                       have_libpy3=yes
+                       AC_DEFINE(HAVE_LIBPY3, 1, [Define if we can link to 
python])
+                       AC_SUBST(libpy3_CFLAGS, $libpy3_CFLAGS)
+                       AC_SUBST(libpy3_LIBS, $libpy3_LIBS)
+               else
+                       if test "x$enable_py3integration" = xyes; then
+                               AC_MSG_ERROR([Python.h not found])
+                       else
+                               have_libpy3="no"
+                               why_have_libpy3="Python.h not found"
+                               enable_py3integration=no
+                               disable_py3integration="Python.h not found"
+                       fi
+               fi
+       fi
+fi
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to