diff --git a/.gitignore b/.gitignore index c2c8d26..880d6f1 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,9 @@ out.k k *.so *.pdf +**/*.cmake +**/Debug +**/Release test*.c* *.csv !test.csv @@ -38,3 +41,5 @@ test*.c* *.shm server/packages/** *.ipynb +*.cmake +*.stackdump diff --git a/Makefile b/Makefile index e078231..eea1d1a 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,14 @@ MonetDB_LIB = ifeq ($(OS),Windows_NT) OS_SUPPORT += server/winhelper.cpp MonetDB_LIB += -Imonetdb/msvc msc-plugin/monetdbe.dll +else + MonetDB_LIB += -lmonetdbe endif -$(info $(OS_SUPPORT)) +info: + $(info $(OS_SUPPORT)) + $(info $(OS)) + $(info "test") server.bin: $(CXX) server/server.cpp $(OS_SUPPORT) --std=c++1z -O3 -march=native -o server.bin server.so: diff --git a/Untitled-1.json b/Untitled-1.json new file mode 100644 index 0000000..28709fe --- /dev/null +++ b/Untitled-1.json @@ -0,0 +1,222 @@ +{ + "stmts": { + "udf": { + "fname": "covariances2", + "params": ["x", "y", "w"], + "stmt": [{ + "assignment": { + "var": "xmeans", + "op": ":=", + "expr": 0.0 + } + }, { + "assignment": { + "var": "ymeans", + "op": ":=", + "expr": 0.0 + } + }, { + "assignment": { + "var": "l", + "op": ":=", + "expr": "_builtin_len" + } + }, { + "if": { + "cond": { + "gt": ["w", "l"] + }, + "assignment": { + "var": "w", + "op": ":=", + "expr": "l" + }, + "elif": [{ + "cond": { + "gt": ["w", { + "add": ["l", 2] + }] + }, + "stmt": [{ + "assignment": { + "var": "l", + "op": ":=", + "expr": 3 + } + }, { + "assignment": { + "var": "w", + "op": ":=", + "expr": 4 + } + }] + }, { + "cond": { + "lt": ["w", 99] + }, + "stmt": { + "assignment": { + "var": "l", + "op": ":=", + "expr": 8 + } + } + }, { + "cond": { + "lt": ["w", 999] + }, + "assignment": { + "var": "w", + "op": ":=", + "expr": 6 + } + }], + "else": { + "assignment": { + "var": "l", + "op": ":=", + "expr": { + "div": ["l", 2] + } + } + } + } + }, { + "for": { + "defs": { + "var": ["i", "j"], + "op": [":=", ":="], + "expr": [0, 0] + }, + "cond": { + "lt": ["i", "w"] + }, + "tail": { + "var": "i", + "op": ":=", + "expr": { + "add": ["i", 1] + } + }, + "stmt": [{ + "assignment": { + "var": "xmeans", + "op": "+=", + "expr": { + "get": ["x", "i"] + } + } + }, { + "assignment": { + "var": "ymeans", + "op": "+=", + "expr": { + "get": ["y", "i"] + } + } + }, { + "assignment": { + "var": { + "get": ["_builtin_ret", "i"] + }, + "op": ":=", + "expr": { + "avg": { + "mul": [{ + "sub": [{ + "x": [{ + "sub": ["l", "w"] + }, "l"] + }, "xmeans"] + }, { + "sub": [{ + "y": [{ + "sub": ["l", "w"] + }, "l"] + }, "ymeans"] + }] + } + } + } + }] + } + }, { + "for": { + "defs": { + "var": "i", + "op": ":=", + "expr": 0 + }, + "cond": { + "lt": ["i", "l"] + }, + "tail": { + "var": "i", + "op": "+=", + "expr": 1 + }, + "stmt": [{ + "assignment": { + "var": "xmeans", + "op": "+=", + "expr": { + "div": [{ + "sub": [{ + "get": ["x", "i"] + }, { + "get": ["x", { + "sub": ["i", "w"] + }] + }] + }, "w"] + } + } + }, { + "assignment": { + "var": "ymeans", + "op": "+=", + "expr": { + "div": [{ + "sub": [{ + "get": ["y", "i"] + }, { + "get": ["y", { + "sub": ["i", "w"] + }] + }] + }, "w"] + } + } + }, { + "assignment": { + "var": { + "get": ["_builtin_ret", "i"] + }, + "op": ":=", + "expr": { + "avg": { + "mul": [{ + "sub": [{ + "x": [{ + "sub": ["l", "w"] + }, "l"] + }, "xmeans"] + }, { + "sub": [{ + "y": [{ + "sub": ["l", "w"] + }, "l"] + }, "ymeans"] + }] + } + } + } + }] + } + }], + "ret": { + "null": {} + } + } + } +} \ No newline at end of file diff --git a/aquery_config.py b/aquery_config.py index 0c65b6f..60d6773 100644 --- a/aquery_config.py +++ b/aquery_config.py @@ -1,30 +1,32 @@ -# put environment specific configuration here - -import os -# os.environ['CXX'] = 'C:/Program Files/LLVM/bin/clang.exe' - -add_path_to_ldpath = True - -os_platform = 'unkown' - -import sys - -if os.name == 'nt': - if sys.platform == 'win32': - os_platform = 'win' - elif sys.platform == 'cygwin' or sys.platform == 'msys': - os_platform = 'cygwin' -elif os.name == 'posix': - if sys.platform == 'darwin': - os_platform = 'mac' - elif 'linux' in sys.platform: - os_platform = 'linux' - elif 'bsd' in sys.platform: - os_platform = 'bsd' - - -# deal with msys dependencies: -if os_platform == 'win': - os.add_dll_directory('c:/msys64/usr/bin') - os.add_dll_directory(os.path.abspath('./msc-plugin')) +# put environment specific configuration here + +import os +# os.environ['CXX'] = 'C:/Program Files/LLVM/bin/clang.exe' + +add_path_to_ldpath = True +rebuild_backend = False +run_backend = False + +os_platform = 'unkown' + +import sys + +if os.name == 'nt': + if sys.platform == 'win32': + os_platform = 'win' + elif sys.platform == 'cygwin' or sys.platform == 'msys': + os_platform = 'cygwin' +elif os.name == 'posix': + if sys.platform == 'darwin': + os_platform = 'mac' + elif 'linux' in sys.platform: + os_platform = 'linux' + elif 'bsd' in sys.platform: + os_platform = 'bsd' + + +# deal with msys dependencies: +if os_platform == 'win': + os.add_dll_directory('c:/msys64/usr/bin') + os.add_dll_directory(os.path.abspath('./msc-plugin')) print("adding path") \ No newline at end of file diff --git a/aquery_parser/keywords.py b/aquery_parser/keywords.py index c948a78..479081b 100644 --- a/aquery_parser/keywords.py +++ b/aquery_parser/keywords.py @@ -34,6 +34,7 @@ FETCH = keyword("fetch").suppress() FROM = keyword("from").suppress() FULL = keyword("full") FUNCTION = keyword("function").suppress() +AGGREGATION = keyword("aggregation").suppress() GROUP = keyword("group").suppress() HAVING = keyword("having").suppress() INNER = keyword("inner") @@ -73,6 +74,11 @@ RECURSIVE = keyword("recursive").suppress() VALUES = keyword("values").suppress() WINDOW = keyword("window") INTO = keyword("into").suppress() +IF = keyword("if").suppress() +STATIC = keyword("static").suppress() +ELIF = keyword("elif").suppress() +ELSE = keyword("else").suppress() +FOR = keyword("for").suppress() PRIMARY_KEY = Group(PRIMARY + KEY).set_parser_name("primary_key") FOREIGN_KEY = Group(FOREIGN + KEY).set_parser_name("foreign_key") @@ -112,8 +118,14 @@ INDF = ( keyword("is not distinct from").set_parser_name("ne!") ) FASSIGN = Literal(":=").set_parser_name("fassign") # Assignment in UDFs +PASSIGN = Literal("+=").set_parser_name("passign") +MASSIGN = Literal("-=").set_parser_name("massign") +MULASSIGN = Literal("*=").set_parser_name("mulassign") +DASSIGN = Literal("/=").set_parser_name("dassign") +COLON = Literal(":").set_parser_name("colon") NEQ = (Literal("!=") | Literal("<>")).set_parser_name("neq") LAMBDA = Literal("->").set_parser_name("lambda") +DOT = Literal(".").set_parser_name("dot") AND = keyword("and") BETWEEN = keyword("between") @@ -233,6 +245,8 @@ L_INLINE = Literal("").suppress() R_INLINE = Literal("").suppress() LBRACE = Literal("{").suppress() RBRACE = Literal("}").suppress() +LSB = Literal("[").suppress() +RSB = Literal("]").suppress() LB = Literal("(").suppress() RB = Literal(")").suppress() EQ = Char("=").suppress() diff --git a/aquery_parser/sql_parser.py b/aquery_parser/sql_parser.py index f07eddd..9a6e88a 100644 --- a/aquery_parser/sql_parser.py +++ b/aquery_parser/sql_parser.py @@ -235,6 +235,8 @@ def parser(literal_string, ident, sqlserver=False): scale_function = ((real_num | int_num) + call_function) / scale scale_ident = ((real_num | int_num) + ident) / scale + + compound = ( NULL | TRUE @@ -329,13 +331,40 @@ def parser(literal_string, ident, sqlserver=False): + Group(var_name("name") + AS + over_clause("value"))("join") ) ) / to_join_call - - fassign = Group(var_name("var") + Suppress(FASSIGN) + expr("expr") + Suppress(";"))("assignment") - fassigns = fassign + ZeroOrMore(fassign, Whitespace(white=" \t")) - fbody = (Optional(fassigns) + expr("ret")) + + definable_name = Forward() + dindex = definable_name("l") + LSB + expr("idx") + RSB + definable_name << var_name | dindex + + # lname = Forward() + # ptr = (lname("l") + LAMBDA + var_name("r")) + # member = (lname("l") + DOT + var_name("r")) + # idx = (expr | COLON) + # index = (lname("l") + LSB + expr("lidx") + "," + idx("ridx") + RSB) + # lname << var_name | ptr | member | index + + assignment = expr("var") + (FASSIGN|PASSIGN|MASSIGN|MULASSIGN|DASSIGN)("op") + expr("expr") + declaration = definable_name("var") + Optional(Suppress(FASSIGN) + expr("expr")) + fassign = Group(assignment + Suppress(";"))("assignment") + static_decl = Group(STATIC + delimited_list(declaration))("static_decl") + stmt = Forward() + elifstmt = Group(ELIF + LB + expr("cond") + RB + stmt)("elif") + elsestmt = Group(ELSE + stmt)("else") + ifstmt = Group(IF + LB + expr("cond") + RB + stmt + + ZeroOrMore(elifstmt) + Optional(elsestmt))("if") + forstmt = Group(FOR + LB + ( delimited_list(assignment)("defs") + + Suppress(";") + expr("cond") + + Suppress(";") + delimited_list(assignment)("tail")) + + RB + stmt)("for") + block = Forward() + stmt << (fassign|ifstmt|forstmt|block|Suppress(";")) + stmts = (ZeroOrMore(stmt("stmt"), Whitespace())) + block << (LBRACE + Optional(stmts) + RBRACE)("code_block") + fbody = (Optional(static_decl) + Optional(stmts) + expr("ret")) udf = ( + Optional(AGGREGATION("Agg")) + FUNCTION + var_name("fname") + LB diff --git a/build_instructions.md b/build_instructions.md index 080188f..6d06dd6 100644 --- a/build_instructions.md +++ b/build_instructions.md @@ -1,15 +1,15 @@ -## Windows -- clang-msvc: - - "%CXX%" -D_CRT_SECURE_NO_WARNINGS -shared server/server.cpp server/winhelper.cpp server/monetdb_conn.cpp -Imonetdb/msvc -Lmonetdb/msvc -lmonetdbe.lib --std=c++2a -o server.so - - os.add_dll_directory(os.path.abspath('./monetdb/msvc')) -- gcc-mingw (link w/ msvc monetdb): - - "%CXX%" -shared -fPIC server/server.cpp server/winhelper.cpp server/monetdb_conn.cpp -Imonetdb/msvc msc-plugin/monetdbe.dll --std=c++2a -o server.so - - os.add_dll_directory('c:/msys64/usr/bin') - - os.add_dll_directory(os.path.abspath('./monetdb/msvc')) -- gcc-mingw (link w/ mingw monetdb, can only load under mingw python): - - $(CXX) server/server.cpp server/monetdb_conn.cpp -fPIC -shared $(OS_SUPPORT) --std=c++1z -O3 -march=native -o server.so -I./monetdb/msys64 -L./lib -lmonetdbe - - os.add_dll_directory('c:/msys64/usr/bin') - - os.add_dll_directory(os.path.abspath('./lib')) -- msvc: - - D:\gg\vs22\MSBuild\Current\Bin\msbuild "d:\gg\AQuery++\server\server.vcxproj" /p:configuration=Release /p:platform=x64 - - os.add_dll_directory(os.path.abspath('./monetdb/msvc')) +## Windows +- clang-msvc: + - "%CXX%" -D_CRT_SECURE_NO_WARNINGS -shared server/server.cpp server/winhelper.cpp server/monetdb_conn.cpp -Imonetdb/msvc -Lmonetdb/msvc -lmonetdbe.lib --std=c++2a -o server.so + - os.add_dll_directory(os.path.abspath('./monetdb/msvc')) +- gcc-mingw (link w/ msvc monetdb): + - "%CXX%" -shared -fPIC server/server.cpp server/winhelper.cpp server/monetdb_conn.cpp -Imonetdb/msvc msc-plugin/monetdbe.dll --std=c++2a -o server.so + - os.add_dll_directory('c:/msys64/usr/bin') + - os.add_dll_directory(os.path.abspath('./monetdb/msvc')) +- gcc-mingw (link w/ mingw monetdb, can only load under mingw python): + - $(CXX) server/server.cpp server/monetdb_conn.cpp -fPIC -shared $(OS_SUPPORT) --std=c++1z -O3 -march=native -o server.so -I./monetdb/msys64 -L./lib -lmonetdbe + - os.add_dll_directory('c:/msys64/usr/bin') + - os.add_dll_directory(os.path.abspath('./lib')) +- msvc: + - D:\gg\vs22\MSBuild\Current\Bin\msbuild "d:\gg\AQuery++\server\server.vcxproj" /p:configuration=Release /p:platform=x64 + - os.add_dll_directory(os.path.abspath('./monetdb/msvc')) diff --git a/engine/types.py b/engine/types.py index b733149..6f213e4 100644 --- a/engine/types.py +++ b/engine/types.py @@ -79,6 +79,10 @@ LongT = Types(4, name = 'int64', sqlname = 'BIGINT', fp_type = DoubleT) ByteT = Types(1, name = 'int8', sqlname = 'TINYINT', long_type=LongT, fp_type=FloatT) ShortT = Types(2, name = 'int16', sqlname='SMALLINT', long_type=LongT, fp_type=FloatT) IntT = Types(3, name = 'int', cname = 'int', long_type=LongT, fp_type=FloatT) +ULongT = Types(8, name = 'uint64', sqlname = 'UINT64', fp_type=DoubleT) +UIntT = Types(7, name = 'uint32', sqlname = 'UINT32', long_type=ULongT, fp_type=FloatT) +UShortT = Types(6, name = 'uint16', sqlname = 'UINT16', long_type=ULongT, fp_type=FloatT) +UByteT = Types(5, name = 'uint8', sqlname = 'UINT8', long_type=ULongT, fp_type=FloatT) StrT = Types(200, name = 'str', cname = 'const char*', sqlname='VARCHAR', ctype_name = 'types::STRING') def _ty_make_dict(fn : str, *ty : Types): return {eval(fn):t for t in ty} @@ -214,6 +218,11 @@ spnull = OperatorBase('missing', 1, logical, cname = "", sqlname = "", call = is # cstdlib fnsqrt = OperatorBase('sqrt', 1, lambda *_ : DoubleT, cname = 'sqrt', sqlname = 'SQRT', call = fn_behavior) +fnlog = OperatorBase('log', 2, lambda *_ : DoubleT, cname = 'log', sqlname = 'LOG', call = fn_behavior) +fnsin = OperatorBase('sin', 1, lambda *_ : DoubleT, cname = 'sin', sqlname = 'SIN', call = fn_behavior) +fncos = OperatorBase('cos', 1, lambda *_ : DoubleT, cname = 'cos', sqlname = 'COS', call = fn_behavior) +fntan = OperatorBase('tan', 1, lambda *_ : DoubleT, cname = 'tan', sqlname = 'TAN', call = fn_behavior) +fnpow = OperatorBase('pow', 2, lambda *_ : DoubleT, cname = 'pow', sqlname = 'POW', call = fn_behavior) # type collections def _op_make_dict(*items : OperatorBase): @@ -223,8 +232,8 @@ builtin_binary_logical = _op_make_dict(opand, opor, opxor, opgt, oplt, opge, opl builtin_unary_logical = _op_make_dict(opnot) builtin_unary_arith = _op_make_dict(opneg) builtin_unary_special = _op_make_dict(spnull) -builtin_cstdlib = _op_make_dict(fnsqrt) +builtin_cstdlib = _op_make_dict(fnsqrt, fnlog, fnsin, fncos, fntan, fnpow) builtin_func = _op_make_dict(fnmax, fnmin, fnsum, fnavg, fnmaxs, fnmins, fnsums, fnavgs, fncnt) -builtin_operators : dict[str, OperatorBase] = {**builtin_binary_arith, **builtin_binary_logical, +builtin_operators : Dict[str, OperatorBase] = {**builtin_binary_arith, **builtin_binary_logical, **builtin_unary_arith, **builtin_unary_logical, **builtin_unary_special, **builtin_func, **builtin_cstdlib} \ No newline at end of file diff --git a/engine/utils.py b/engine/utils.py index 7354caa..20ede54 100644 --- a/engine/utils.py +++ b/engine/utils.py @@ -1,19 +1,23 @@ import uuid -base62alp = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' +lower_alp = 'abcdefghijklmnopqrstuvwxyz' +upper_alp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' nums = '0123456789' +base62alp = nums + lower_alp + upper_alp + reserved_monet = ['month'] + def base62uuid(crop=8): - id = uuid.uuid4().int + _id = uuid.uuid4().int ret = '' - while id: - ret = base62alp[id % 62] + ret - id //= 62 + while _id: + ret = base62alp[_id % 62] + ret + _id //= 62 return ret[:crop] if len(ret) else '0' -def get_leagl_name(name, lower = True): +def get_legal_name(name, lower = True): if name is not None: if lower: name = name.lower() @@ -26,7 +30,7 @@ def get_leagl_name(name, lower = True): return name -def check_leagl_name(name): +def check_legal_name(name): all_underscores = True for c in name: if c not in base62alp and c != '_': @@ -53,4 +57,17 @@ def has_other(a, b): return False def defval(val, default): - return default if val is None else val \ No newline at end of file + return default if val is None else val + +# escape must be readonly +from typing import Set +def remove_last(pattern : str, string : str, escape : Set[str] = set()) -> str: + idx = string.rfind(pattern) + if idx == -1: + return string + else: + if set(string[idx:]).difference(escape): + return string + else: + return string[:idx] + string[idx+1:] + \ No newline at end of file diff --git a/funcs.a b/funcs.a index 2b130fe..3bf922e 100644 --- a/funcs.a +++ b/funcs.a @@ -1,24 +1,35 @@ -FUNCTION covariance (x , y ) { -xmean := avg (x) ; -ymean := avg (y) ; -avg (( x - xmean ) * (y - ymean )) -} - -FUNCTION sd ( x) { -sqrt ( covariance (x , x) ) -} - -FUNCTION pairCorr (x , y ) { -covariance (x , y ) / ( sd (x) * sd (y )) -} - -CREATE TABLE test1(a INT, b INT, c INT, d INT) - -LOAD DATA INFILE "test.csv" -INTO TABLE test1 -FIELDS TERMINATED BY "," - -SELECT pairCorr(c, b) * d, sum(a), b -FROM test1 -group by c,b,d +FUNCTION covariance (x , y ) { +xmean := avg (x) ; +ymean := avg (y) ; +avg (( x - xmean ) * (y - ymean )) +} + + +FUNCTION sd ( x) { +sqrt ( covariance (x , x) ) +} + +AGGREGATION FUNCTION covariances(x, y, w){ + static xmeans := 0, ymeans := 0, cnt := 0; + if (cnt < w) { xmeans += x; } + else { + xmeans += (x - x.vec[cnt - w]) / w; + ymeans += (y - y.vec[cnt - w]) / w; + } + avg (( x.vec(x.len-w, x.len) - xmean ) * (y.vec(y.len - w, y.len) - ymean )) +} + +FUNCTION pairCorr (x , y ) { +covariance (x , y ) / ( sd (x) * sd (y )) +} + +CREATE TABLE test1(a INT, b INT, c INT, d INT) + +LOAD DATA INFILE "test.csv" +INTO TABLE test1 +FIELDS TERMINATED BY "," + +SELECT pairCorr(c, b) * d, sum(a), b +FROM test1 +group by c,b,d order by b ASC \ No newline at end of file diff --git a/joins.a b/joins.a index 3edb2a2..3ed82a1 100644 --- a/joins.a +++ b/joins.a @@ -1,34 +1,34 @@ -FUNCTION covariance (x , y ) { -xmean := avg (x) ; -ymean := avg (y) ; -avg (( x - xmean ) * (y - ymean )) -} - -FUNCTION sd ( x) { -sqrt ( covariance (x , x) ) -} - -FUNCTION pairCorr (x , y ) { -covariance (x , y ) / ( sd (x) * sd (y )) -} - --- FUNCTION covariances (w, x , y ) { --- xmean := avgs (w, x) ; --- ymean := avgs (y) ; --- avg (( x - xmean ) * (y - ymean )) --- } - -CREATE TABLE tt(a INT, b INT, c INT, d INT) - -LOAD DATA INFILE "test.csv" -INTO TABLE tt -FIELDS TERMINATED BY "," - -CREATE TABLE sale(Mont INT, sales INT) - -LOAD DATA INFILE "moving_avg.csv" -INTO TABLE sale -FIELDS TERMINATED BY "," - -select sd(a) + sales from tt, sale where tt.a = sale.Mont - +FUNCTION covariance (x , y ) { +xmean := avg (x) ; +ymean := avg (y) ; +avg (( x - xmean ) * (y - ymean )) +} + +FUNCTION sd ( x) { +sqrt ( covariance (x , x) ) +} + +FUNCTION pairCorr (x , y ) { +covariance (x , y ) / ( sd (x) * sd (y )) +} + +-- FUNCTION covariances (w, x , y ) { +-- xmean := avgs (w, x) ; +-- ymean := avgs (y) ; +-- avg (( x - xmean ) * (y - ymean )) +-- } + +CREATE TABLE tt(a INT, b INT, c INT, d INT) + +LOAD DATA INFILE "test.csv" +INTO TABLE tt +FIELDS TERMINATED BY "," + +CREATE TABLE sale(Mont INT, sales INT) + +LOAD DATA INFILE "moving_avg.csv" +INTO TABLE sale +FIELDS TERMINATED BY "," + +select sd(a) + sales from tt, sale where tt.a = sale.Mont + diff --git a/lib/monetdb_config_headerTargets.cmake b/lib/monetdb_config_headerTargets.cmake deleted file mode 100644 index 5736e8e..0000000 --- a/lib/monetdb_config_headerTargets.cmake +++ /dev/null @@ -1,98 +0,0 @@ -# Generated by CMake - -if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6) - message(FATAL_ERROR "CMake >= 2.6.0 required") -endif() -cmake_policy(PUSH) -cmake_policy(VERSION 2.6...3.21) -#---------------------------------------------------------------- -# Generated CMake target import file. -#---------------------------------------------------------------- - -# Commands may need to know the format version. -set(CMAKE_IMPORT_FILE_VERSION 1) - -# Protect against multiple inclusion, which would fail when already imported targets are added once more. -set(_targetsDefined) -set(_targetsNotDefined) -set(_expectedTargets) -foreach(_expectedTarget MonetDB::monetdb_config_header) - list(APPEND _expectedTargets ${_expectedTarget}) - if(NOT TARGET ${_expectedTarget}) - list(APPEND _targetsNotDefined ${_expectedTarget}) - endif() - if(TARGET ${_expectedTarget}) - list(APPEND _targetsDefined ${_expectedTarget}) - endif() -endforeach() -if("${_targetsDefined}" STREQUAL "${_expectedTargets}") - unset(_targetsDefined) - unset(_targetsNotDefined) - unset(_expectedTargets) - set(CMAKE_IMPORT_FILE_VERSION) - cmake_policy(POP) - return() -endif() -if(NOT "${_targetsDefined}" STREQUAL "") - message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") -endif() -unset(_targetsDefined) -unset(_targetsNotDefined) -unset(_expectedTargets) - - -# Compute the installation prefix relative to this file. -get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) -get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) -if(_IMPORT_PREFIX STREQUAL "/") - set(_IMPORT_PREFIX "") -endif() - -# Create imported target MonetDB::monetdb_config_header -add_library(MonetDB::monetdb_config_header INTERFACE IMPORTED) - -set_target_properties(MonetDB::monetdb_config_header PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/monetdb" -) - -if(CMAKE_VERSION VERSION_LESS 3.0.0) - message(FATAL_ERROR "This file relies on consumers using CMake 3.0.0 or greater.") -endif() - -# Load information for each installed configuration. -get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -file(GLOB CONFIG_FILES "${_DIR}/monetdb_config_headerTargets-*.cmake") -foreach(f ${CONFIG_FILES}) - include(${f}) -endforeach() - -# Cleanup temporary variables. -set(_IMPORT_PREFIX) - -# Loop over all imported files and verify that they actually exist -foreach(target ${_IMPORT_CHECK_TARGETS} ) - foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) - if(NOT EXISTS "${file}" ) - message(FATAL_ERROR "The imported target \"${target}\" references the file - \"${file}\" -but this file does not exist. Possible reasons include: -* The file was deleted, renamed, or moved to another location. -* An install or uninstall procedure did not complete successfully. -* The installation package was faulty and contained - \"${CMAKE_CURRENT_LIST_FILE}\" -but not all the files it references. -") - endif() - endforeach() - unset(_IMPORT_CHECK_FILES_FOR_${target}) -endforeach() -unset(_IMPORT_CHECK_TARGETS) - -# This file does not depend on other imported targets which have -# been exported from the same project but in a separate export set. - -# Commands beyond this point should not need to know the version. -set(CMAKE_IMPORT_FILE_VERSION) -cmake_policy(POP) diff --git a/modules.a b/modules.a new file mode 100644 index 0000000..904c559 --- /dev/null +++ b/modules.a @@ -0,0 +1,4 @@ +LOAD MODULE FROM "test.so" +FUNCTIONS (div(a:int, b:int) -> double, + mulvec(a:int, b:vecfloat) -> vecfloat +); \ No newline at end of file diff --git a/monetdb/msvc/monetdb_config.h b/monetdb/msvc/monetdb_config.h index 4abf701..11be9fb 100644 --- a/monetdb/msvc/monetdb_config.h +++ b/monetdb/msvc/monetdb_config.h @@ -1,466 +1,466 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. - */ -/* monetdb_config.h.in. Generated from CMakeLists.txt */ - -#ifndef MT_SEEN_MONETDB_CONFIG_H -#define MT_SEEN_MONETDB_CONFIG_H 1 - -#ifdef _MSC_VER - -#if _MSC_VER < 1900 -#error Versions below Visual Studio 2015 are no longer supported -#endif - -/* Prevent pollution through excessive inclusion of include files by Windows.h. */ -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN 1 -#endif - -/* Visual Studio 8 has deprecated lots of stuff: suppress warnings */ -#ifndef _CRT_SECURE_NO_DEPRECATE -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -#define _CRT_RAND_S /* for Windows rand_s, before stdlib.h */ -#define HAVE_RAND_S 1 - -#endif - -#if !defined(_XOPEN_SOURCE) && defined(__CYGWIN__) -#define _XOPEN_SOURCE 700 -#endif - -#include -#if defined(_MSC_VER) && defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) -/* In this case, malloc and friends are redefined in crtdbg.h to debug - * versions. We need to include stdlib.h first or else we get - * conflicting declarations. */ -#include -#endif - -#define HAVE_SYS_TYPES_H 1 -#ifdef HAVE_SYS_TYPES_H -# include -#endif - -/* standard C-99 include files */ -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER - -/* Windows include files */ -#include -#include -#include - -/* indicate to sqltypes.h that windows.h has already been included and - that it doesn't have to define Windows constants */ -#define ALREADY_HAVE_WINDOWS_TYPE 1 - -#define NATIVE_WIN32 1 - -#endif /* _MSC_VER */ - -#if !defined(WIN32) && (defined(__CYGWIN__) || defined(__MINGW32__)) -#define WIN32 1 -#endif - -// Section: monetdb configure defines -/* #undef HAVE_DISPATCH_DISPATCH_H */ -/* #undef HAVE_DLFCN_H */ -#define HAVE_FCNTL_H 1 -#define HAVE_IO_H 1 -/* #undef HAVE_KVM_H */ -/* #undef HAVE_LIBGEN_H */ -/* #undef HAVE_LIBINTL_H */ -/* #undef HAVE_MACH_MACH_INIT_H */ -/* #undef HAVE_MACH_TASK_H */ -/* #undef HAVE_MACH_O_DYLD_H */ -/* #undef HAVE_NETDB_H */ -/* #undef HAVE_NETINET_IN_H */ -/* #undef HAVE_POLL_H */ -/* #undef HAVE_PROCFS_H */ -/* #undef HAVE_PWD_H */ -/* #undef HAVE_STRINGS_H */ -/* #undef HAVE_STROPTS_H */ -/* #undef HAVE_SYS_FILE_H */ -/* #undef HAVE_SYS_IOCTL_H */ -/* #undef HAVE_SYS_SYSCTL_H */ -/* #undef HAVE_SYS_MMAN_H */ -/* #undef HAVE_SYS_PARAM_H */ -/* #undef HAVE_SYS_RANDOM_H */ -/* #undef HAVE_SYS_RESOURCE_H */ -/* #undef HAVE_SYS_TIME_H */ -/* #undef HAVE_SYS_TIMES_H */ -/* #undef HAVE_SYS_UIO_H */ -/* #undef HAVE_SYS_UN_H */ -/* #undef HAVE_SYS_WAIT_H */ -/* #undef HAVE_TERMIOS_H */ -/* #undef HAVE_UNISTD_H */ -/* #undef HAVE_UUID_UUID_H */ -#define HAVE_WINSOCK_H 1 -/* #undef HAVE_SEMAPHORE_H */ -#define HAVE_GETOPT_H 1 - -/* #undef HAVE_STDATOMIC_H */ - -/* #undef HAVE_DIRENT_H */ -/* #undef HAVE_SYS_SOCKET_H */ -/* #undef HAVE_GETTIMEOFDAY */ -#define HAVE_SYS_STAT_H 1 -/* #undef HAVE_FDATASYNC */ -/* #undef HAVE_ACCEPT4 */ -/* #undef HAVE_ASCTIME_R */ -/* #undef HAVE_CLOCK_GETTIME */ -/* #undef HAVE_CTIME_R */ -/* #undef HAVE_DISPATCH_SEMAPHORE_CREATE */ -/* #undef HAVE_FALLOCATE */ -/* #undef HAVE_FCNTL */ -/* #undef HAVE_FORK */ -/* #undef HAVE_FSYNC */ -#define HAVE_FTIME 1 -/* #undef HAVE_GETENTROPY */ -/* #undef HAVE_GETEXECNAME */ -/* #undef HAVE_GETLOGIN */ -#define HAVE_GETOPT_LONG 1 -/* #undef HAVE_GETRLIMIT */ -/* #undef HAVE_GETTIMEOFDAY */ -/* #undef HAVE_GETUID */ -/* #undef HAVE_GMTIME_R */ -/* #undef HAVE_LOCALTIME_R */ -/* #undef HAVE_STRERROR_R */ -/* #undef HAVE_LOCKF */ -/* #undef HAVE_MADVISE */ -/* #undef HAVE_MREMAP */ -/* #undef HAVE_NANOSLEEP */ -/* #undef HAVE_NL_LANGINFO */ -/* #undef HAVE__NSGETEXECUTABLEPATH */ -/* #undef HAVE_PIPE2 */ -/* #undef HAVE_POLL */ -/* #undef HAVE_POPEN */ -/* #undef HAVE_POSIX_FADVISE */ -/* #undef HAVE_POSIX_FALLOCATE */ -/* #undef HAVE_POSIX_MADVISE */ -#define HAVE_PUTENV 1 -/* #undef HAVE_SETSID */ -#define HAVE_SHUTDOWN 1 -/* #undef HAVE_SIGACTION */ -/* #undef HAVE_STPCPY */ -/* #undef HAVE_STRCASESTR */ -/* #undef HAVE_STRNCASECMP */ -/* #undef HAVE_STRPTIME */ -/* #undef HAVE_STRSIGNAL */ -/* #undef HAVE_SYSCONF */ -/* #undef HAVE_TASK_INFO */ -/* #undef HAVE_TIMES */ -/* #undef HAVE_UNAME */ -/* #undef HAVE_SEMTIMEDOP */ -/* #undef HAVE_PTHREAD_KILL */ -/* #undef HAVE_PTHREAD_SIGMASK */ -#define HAVE_GETOPT 1 - -#define ICONV_CONST -#define FLEXIBLE_ARRAY_MEMBER -#define ENABLE_MAPI 1 -#define HAVE_MAPI 1 -// End Section: monetdb configure defines - -// Section: monetdb macro variables -#define HAVE_ICONV 1 -/* #undef HAVE_PTHREAD_H */ -#define HAVE_LIBPCRE 1 -#define HAVE_LIBBZ2 1 -/* #undef HAVE_CURL */ -#define HAVE_LIBLZMA 1 -#define HAVE_LIBXML 1 -#define HAVE_LIBZ 1 -#define HAVE_LIBLZ4 1 -/* #undef HAVE_PROJ */ -/* #undef HAVE_SNAPPY */ -/* #undef HAVE_FITS */ -/* #undef HAVE_UUID */ -/* #undef HAVE_VALGRIND */ -/* #undef HAVE_NETCDF */ -/* #undef HAVE_READLINE */ -/* #undef HAVE_LIBR */ -#define RHOME "/registry" -#define HAVE_GEOM 1 -/* #undef HAVE_SHP */ -#define HAVE_LIBPY3 1 - -// #define SOCKET_LIBRARIES -#define HAVE_GETADDRINFO 1 -/* #undef HAVE_CUDF */ - -#define MAPI_PORT 50000 -#define MAPI_PORT_STR "50000" - -#ifdef _MSC_VER -#define DIR_SEP '\\' -#define PATH_SEP ';' -#define DIR_SEP_STR "\\" -#define SO_PREFIX "" -#else -#define DIR_SEP '/' -#define PATH_SEP ':' -#define DIR_SEP_STR "/" -/* #undef SO_PREFIX */ -#endif -#define SO_EXT ".dll" - -#define BINDIR "C:/cygwin64/home/monet/x86_64/install/bin" -#define LIBDIR "C:/cygwin64/home/monet/x86_64/install/lib" -#define LOCALSTATEDIR "C:/cygwin64/home/monet/x86_64/install/var" - -// End Section: monetdb macro variables - -// Section: monetdb configure misc -#define MONETDB_RELEASE "Jan2022-SP3" - -#define MONETDB_VERSION "11.43.15" -#define MONETDB_VERSION_MAJOR 11 -#define MONETDB_VERSION_MINOR 43 -#define MONETDB_VERSION_PATCH 15 - -#define GDK_VERSION "25.1.0" -#define GDK_VERSION_MAJOR 25 -#define GDK_VERSION_MINOR 1 -#define GDK_VERSION_PATCH 0 -#define MAPI_VERSION "14.0.2" -#define MAPI_VERSION_MAJOR 14 -#define MAPI_VERSION_MINOR 0 -#define MAPI_VERSION_PATCH 2 -#define MONETDB5_VERSION "32.0.6" -#define MONETDB5_VERSION_MAJOR 32 -#define MONETDB5_VERSION_MINOR 0 -#define MONETDB5_VERSION_PATCH 6 -#define MONETDBE_VERSION "3.0.2" -#define MONETDBE_VERSION_MAJOR 3 -#define MONETDBE_VERSION_MINOR 0 -#define MONETDBE_VERSION_PATCH 2 -#define STREAM_VERSION "16.0.1" -#define STREAM_VERSION_MAJOR 16 -#define STREAM_VERSION_MINOR 0 -#define STREAM_VERSION_PATCH 1 -#define SQL_VERSION "12.0.5" -#define SQL_VERSION_MAJOR 12 -#define SQL_VERSION_MINOR 0 -#define SQL_VERSION_PATCH 5 - -/* Host identifier */ -#define HOST "amd64-pc-windows-msvc" - -/* The used password hash algorithm */ -#define MONETDB5_PASSWDHASH "SHA512" - -/* The used password hash algorithm */ -#define MONETDB5_PASSWDHASH_TOKEN SHA512 - -#ifndef _Noreturn -#define _Noreturn __declspec(noreturn) -#endif -#ifndef __cplusplus -/* Does your compiler support `inline' keyword? (C99 feature) */ -#ifndef inline -#define inline __inline -#endif -/* Does your compiler support `__restrict__' keyword? (C99 feature) */ -#ifndef __restrict__ -#define __restrict__ restrict -#endif -#endif - -#ifdef _MSC_VER -#ifndef __restrict__ -#define __restrict__ __restrict -#endif -#endif - -// End Section: monetdb configure misc - -// Section: monetdb configure sizes -#define SIZEOF_SIZE_T 8 - -/* The size of `void *', as computed by sizeof. */ -#define SIZEOF_VOID_P 8 - -#define SIZEOF_CHAR 1 -#define SIZEOF_SHORT 2 -#define SIZEOF_INT 4 -#define SIZEOF_LONG 4 -#define SIZEOF_LONG_LONG 8 -#define SIZEOF_DOUBLE 8 -#define SIZEOF_WCHAR_T 2 -#define HAVE_LONG_LONG 1 /* for ODBC include files */ - -#ifdef _MSC_VER -#ifdef _WIN64 -#define LENP_OR_POINTER_T SQLLEN * -#else -#define LENP_OR_POINTER_T SQLPOINTER -#endif -#else -#define LENP_OR_POINTER_T SQLLEN * -#endif -#define SIZEOF_SQLWCHAR 2 - -/* #undef WORDS_BIGENDIAN */ - -/* Does your compiler support `ssize_t' type? (Posix type) */ -#ifndef ssize_t -#define ssize_t int64_t -#endif - -/* The size of `__int128', as computed by sizeof. */ -/* #undef SIZEOF___INT128 */ - -/* The size of `__int128_t', as computed by sizeof. */ -/* #undef SIZEOF___INT128_T */ - -/* The size of `__uint128_t', as computed by sizeof. */ -/* #undef SIZEOF___UINT128_T */ - -#ifdef SIZEOF___INT128 -typedef __int128 hge; -typedef unsigned __int128 uhge; -#define HAVE_HGE 1 -#define SIZEOF_HGE SIZEOF___INT128 -#elif defined(SIZEOF___INT128_T) && defined(SIZEOF___UINT128_T) -typedef __int128_t hge; -typedef __uint128_t uhge; -#define HAVE_HGE 1 -#define SIZEOF_HGE SIZEOF___INT128_T -#endif - -// End Section: monetdb configure sizes - -/* Does your compiler support `__attribute__' extension? */ -#if !defined(__GNUC__) && !defined(__clang__) && !defined(__attribute__) -#define __attribute__(a) -#endif - -#if !defined(__cplusplus) || __cplusplus < 201103L -#ifndef static_assert -/* static_assert is a C11/C++11 feature, defined in assert.h which also exists - * in many other compilers we ignore it if the compiler doesn't support it - * However in C11 static_assert is a macro, while on C++11 is a keyword */ -#define static_assert(expr, mesg) ((void) 0) -#endif -#endif - -#ifdef HAVE_STRINGS_H -#include /* strcasecmp */ -#endif - -#ifdef _MSC_VER - -#define strdup(s) _strdup(s) - -#ifndef strcasecmp -#define strcasecmp(x,y) _stricmp(x,y) -#endif - -/* Define to 1 if you have the `strncasecmp' function. */ -#define HAVE_STRNCASECMP 1 -#ifndef strncasecmp -#define strncasecmp(x,y,z) _strnicmp(x,y,z) -#endif - -#include -#ifdef lstat -#undef lstat -#endif -#define lstat _stat64 -#ifdef stat -#undef stat -#endif -#define stat _stat64 -#ifdef fstat -#undef fstat -#endif -#define fstat _fstat64 - -static inline char * -stpcpy(char *__restrict__ dst, const char *__restrict__ src) -{ - size_t i; - for (i = 0; src[i]; i++) - dst[i] = src[i]; - dst[i] = 0; - return dst + i; -} - -/* Define to 1 if the system has the type `socklen_t'. */ -#define HAVE_SOCKLEN_T 1 -/* type used by connect */ -#define socklen_t int -#define strtok_r(t,d,c) strtok_s(t,d,c) - -#define HAVE_GETOPT_LONG 1 - -/* there is something very similar to localtime_r on Windows: */ -#include -#define HAVE_LOCALTIME_R 1 -static inline struct tm * -localtime_r(const time_t *__restrict__ timep, struct tm *__restrict__ result) -{ - return localtime_s(result, timep) == 0 ? result : NULL; -} -#define HAVE_GMTIME_R 1 -static inline struct tm * -gmtime_r(const time_t *__restrict__ timep, struct tm *__restrict__ result) -{ - return gmtime_s(result, timep) == 0 ? result : NULL; -} - -/* Define if you have ctime_r(time_t*,char *buf,size_t s) */ -#define HAVE_CTIME_R 1 -#define HAVE_CTIME_R3 1 -/* there is something very similar to ctime_r on Windows: */ -#define ctime_r(t,b,s) (ctime_s(b,s,t) ? NULL : (b)) - -#endif /* _MSC_VER */ - -#define HAVE_SOCKLEN_T 1 -#ifndef _MSC_VER -#define SOCKET int -#define closesocket close -#endif - -#ifndef _In_z_ -#define _In_z_ -#endif -#ifndef _Printf_format_string_ -#define _Printf_format_string_ -#endif - -#ifdef _MSC_VER -#define _LIB_STARTUP_FUNC_(f,q) \ - static void f(void); \ - __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \ - __pragma(comment(linker,"/include:" q #f "_")) \ - static void f(void) -#ifdef _WIN64 - #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"") -#else - #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"_") -#endif -#else -#define LIB_STARTUP_FUNC(f) \ - static void f(void) __attribute__((__constructor__)); \ - static void f(void) -#endif - -#endif /* MT_SEEN_MONETDB_CONFIG_H */ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. + */ +/* monetdb_config.h.in. Generated from CMakeLists.txt */ + +#ifndef MT_SEEN_MONETDB_CONFIG_H +#define MT_SEEN_MONETDB_CONFIG_H 1 + +#ifdef _MSC_VER + +#if _MSC_VER < 1900 +#error Versions below Visual Studio 2015 are no longer supported +#endif + +/* Prevent pollution through excessive inclusion of include files by Windows.h. */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif + +/* Visual Studio 8 has deprecated lots of stuff: suppress warnings */ +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +#define _CRT_RAND_S /* for Windows rand_s, before stdlib.h */ +#define HAVE_RAND_S 1 + +#endif + +#if !defined(_XOPEN_SOURCE) && defined(__CYGWIN__) +#define _XOPEN_SOURCE 700 +#endif + +#include +#if defined(_MSC_VER) && defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) +/* In this case, malloc and friends are redefined in crtdbg.h to debug + * versions. We need to include stdlib.h first or else we get + * conflicting declarations. */ +#include +#endif + +#define HAVE_SYS_TYPES_H 1 +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +/* standard C-99 include files */ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER + +/* Windows include files */ +#include +#include +#include + +/* indicate to sqltypes.h that windows.h has already been included and + that it doesn't have to define Windows constants */ +#define ALREADY_HAVE_WINDOWS_TYPE 1 + +#define NATIVE_WIN32 1 + +#endif /* _MSC_VER */ + +#if !defined(WIN32) && (defined(__CYGWIN__) || defined(__MINGW32__)) +#define WIN32 1 +#endif + +// Section: monetdb configure defines +/* #undef HAVE_DISPATCH_DISPATCH_H */ +/* #undef HAVE_DLFCN_H */ +#define HAVE_FCNTL_H 1 +#define HAVE_IO_H 1 +/* #undef HAVE_KVM_H */ +/* #undef HAVE_LIBGEN_H */ +/* #undef HAVE_LIBINTL_H */ +/* #undef HAVE_MACH_MACH_INIT_H */ +/* #undef HAVE_MACH_TASK_H */ +/* #undef HAVE_MACH_O_DYLD_H */ +/* #undef HAVE_NETDB_H */ +/* #undef HAVE_NETINET_IN_H */ +/* #undef HAVE_POLL_H */ +/* #undef HAVE_PROCFS_H */ +/* #undef HAVE_PWD_H */ +/* #undef HAVE_STRINGS_H */ +/* #undef HAVE_STROPTS_H */ +/* #undef HAVE_SYS_FILE_H */ +/* #undef HAVE_SYS_IOCTL_H */ +/* #undef HAVE_SYS_SYSCTL_H */ +/* #undef HAVE_SYS_MMAN_H */ +/* #undef HAVE_SYS_PARAM_H */ +/* #undef HAVE_SYS_RANDOM_H */ +/* #undef HAVE_SYS_RESOURCE_H */ +/* #undef HAVE_SYS_TIME_H */ +/* #undef HAVE_SYS_TIMES_H */ +/* #undef HAVE_SYS_UIO_H */ +/* #undef HAVE_SYS_UN_H */ +/* #undef HAVE_SYS_WAIT_H */ +/* #undef HAVE_TERMIOS_H */ +/* #undef HAVE_UNISTD_H */ +/* #undef HAVE_UUID_UUID_H */ +#define HAVE_WINSOCK_H 1 +/* #undef HAVE_SEMAPHORE_H */ +#define HAVE_GETOPT_H 1 + +/* #undef HAVE_STDATOMIC_H */ + +/* #undef HAVE_DIRENT_H */ +/* #undef HAVE_SYS_SOCKET_H */ +/* #undef HAVE_GETTIMEOFDAY */ +#define HAVE_SYS_STAT_H 1 +/* #undef HAVE_FDATASYNC */ +/* #undef HAVE_ACCEPT4 */ +/* #undef HAVE_ASCTIME_R */ +/* #undef HAVE_CLOCK_GETTIME */ +/* #undef HAVE_CTIME_R */ +/* #undef HAVE_DISPATCH_SEMAPHORE_CREATE */ +/* #undef HAVE_FALLOCATE */ +/* #undef HAVE_FCNTL */ +/* #undef HAVE_FORK */ +/* #undef HAVE_FSYNC */ +#define HAVE_FTIME 1 +/* #undef HAVE_GETENTROPY */ +/* #undef HAVE_GETEXECNAME */ +/* #undef HAVE_GETLOGIN */ +#define HAVE_GETOPT_LONG 1 +/* #undef HAVE_GETRLIMIT */ +/* #undef HAVE_GETTIMEOFDAY */ +/* #undef HAVE_GETUID */ +/* #undef HAVE_GMTIME_R */ +/* #undef HAVE_LOCALTIME_R */ +/* #undef HAVE_STRERROR_R */ +/* #undef HAVE_LOCKF */ +/* #undef HAVE_MADVISE */ +/* #undef HAVE_MREMAP */ +/* #undef HAVE_NANOSLEEP */ +/* #undef HAVE_NL_LANGINFO */ +/* #undef HAVE__NSGETEXECUTABLEPATH */ +/* #undef HAVE_PIPE2 */ +/* #undef HAVE_POLL */ +/* #undef HAVE_POPEN */ +/* #undef HAVE_POSIX_FADVISE */ +/* #undef HAVE_POSIX_FALLOCATE */ +/* #undef HAVE_POSIX_MADVISE */ +#define HAVE_PUTENV 1 +/* #undef HAVE_SETSID */ +#define HAVE_SHUTDOWN 1 +/* #undef HAVE_SIGACTION */ +/* #undef HAVE_STPCPY */ +/* #undef HAVE_STRCASESTR */ +/* #undef HAVE_STRNCASECMP */ +/* #undef HAVE_STRPTIME */ +/* #undef HAVE_STRSIGNAL */ +/* #undef HAVE_SYSCONF */ +/* #undef HAVE_TASK_INFO */ +/* #undef HAVE_TIMES */ +/* #undef HAVE_UNAME */ +/* #undef HAVE_SEMTIMEDOP */ +/* #undef HAVE_PTHREAD_KILL */ +/* #undef HAVE_PTHREAD_SIGMASK */ +#define HAVE_GETOPT 1 + +#define ICONV_CONST +#define FLEXIBLE_ARRAY_MEMBER +#define ENABLE_MAPI 1 +#define HAVE_MAPI 1 +// End Section: monetdb configure defines + +// Section: monetdb macro variables +#define HAVE_ICONV 1 +/* #undef HAVE_PTHREAD_H */ +#define HAVE_LIBPCRE 1 +#define HAVE_LIBBZ2 1 +/* #undef HAVE_CURL */ +#define HAVE_LIBLZMA 1 +#define HAVE_LIBXML 1 +#define HAVE_LIBZ 1 +#define HAVE_LIBLZ4 1 +/* #undef HAVE_PROJ */ +/* #undef HAVE_SNAPPY */ +/* #undef HAVE_FITS */ +/* #undef HAVE_UUID */ +/* #undef HAVE_VALGRIND */ +/* #undef HAVE_NETCDF */ +/* #undef HAVE_READLINE */ +/* #undef HAVE_LIBR */ +#define RHOME "/registry" +#define HAVE_GEOM 1 +/* #undef HAVE_SHP */ +#define HAVE_LIBPY3 1 + +// #define SOCKET_LIBRARIES +#define HAVE_GETADDRINFO 1 +/* #undef HAVE_CUDF */ + +#define MAPI_PORT 50000 +#define MAPI_PORT_STR "50000" + +#ifdef _MSC_VER +#define DIR_SEP '\\' +#define PATH_SEP ';' +#define DIR_SEP_STR "\\" +#define SO_PREFIX "" +#else +#define DIR_SEP '/' +#define PATH_SEP ':' +#define DIR_SEP_STR "/" +/* #undef SO_PREFIX */ +#endif +#define SO_EXT ".dll" + +#define BINDIR "C:/cygwin64/home/monet/x86_64/install/bin" +#define LIBDIR "C:/cygwin64/home/monet/x86_64/install/lib" +#define LOCALSTATEDIR "C:/cygwin64/home/monet/x86_64/install/var" + +// End Section: monetdb macro variables + +// Section: monetdb configure misc +#define MONETDB_RELEASE "Jan2022-SP3" + +#define MONETDB_VERSION "11.43.15" +#define MONETDB_VERSION_MAJOR 11 +#define MONETDB_VERSION_MINOR 43 +#define MONETDB_VERSION_PATCH 15 + +#define GDK_VERSION "25.1.0" +#define GDK_VERSION_MAJOR 25 +#define GDK_VERSION_MINOR 1 +#define GDK_VERSION_PATCH 0 +#define MAPI_VERSION "14.0.2" +#define MAPI_VERSION_MAJOR 14 +#define MAPI_VERSION_MINOR 0 +#define MAPI_VERSION_PATCH 2 +#define MONETDB5_VERSION "32.0.6" +#define MONETDB5_VERSION_MAJOR 32 +#define MONETDB5_VERSION_MINOR 0 +#define MONETDB5_VERSION_PATCH 6 +#define MONETDBE_VERSION "3.0.2" +#define MONETDBE_VERSION_MAJOR 3 +#define MONETDBE_VERSION_MINOR 0 +#define MONETDBE_VERSION_PATCH 2 +#define STREAM_VERSION "16.0.1" +#define STREAM_VERSION_MAJOR 16 +#define STREAM_VERSION_MINOR 0 +#define STREAM_VERSION_PATCH 1 +#define SQL_VERSION "12.0.5" +#define SQL_VERSION_MAJOR 12 +#define SQL_VERSION_MINOR 0 +#define SQL_VERSION_PATCH 5 + +/* Host identifier */ +#define HOST "amd64-pc-windows-msvc" + +/* The used password hash algorithm */ +#define MONETDB5_PASSWDHASH "SHA512" + +/* The used password hash algorithm */ +#define MONETDB5_PASSWDHASH_TOKEN SHA512 + +#ifndef _Noreturn +#define _Noreturn __declspec(noreturn) +#endif +#ifndef __cplusplus +/* Does your compiler support `inline' keyword? (C99 feature) */ +#ifndef inline +#define inline __inline +#endif +/* Does your compiler support `__restrict__' keyword? (C99 feature) */ +#ifndef __restrict__ +#define __restrict__ restrict +#endif +#endif + +#ifdef _MSC_VER +#ifndef __restrict__ +#define __restrict__ __restrict +#endif +#endif + +// End Section: monetdb configure misc + +// Section: monetdb configure sizes +#define SIZEOF_SIZE_T 8 + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P 8 + +#define SIZEOF_CHAR 1 +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_WCHAR_T 2 +#define HAVE_LONG_LONG 1 /* for ODBC include files */ + +#ifdef _MSC_VER +#ifdef _WIN64 +#define LENP_OR_POINTER_T SQLLEN * +#else +#define LENP_OR_POINTER_T SQLPOINTER +#endif +#else +#define LENP_OR_POINTER_T SQLLEN * +#endif +#define SIZEOF_SQLWCHAR 2 + +/* #undef WORDS_BIGENDIAN */ + +/* Does your compiler support `ssize_t' type? (Posix type) */ +#ifndef ssize_t +#define ssize_t int64_t +#endif + +/* The size of `__int128', as computed by sizeof. */ +/* #undef SIZEOF___INT128 */ + +/* The size of `__int128_t', as computed by sizeof. */ +/* #undef SIZEOF___INT128_T */ + +/* The size of `__uint128_t', as computed by sizeof. */ +/* #undef SIZEOF___UINT128_T */ + +#ifdef SIZEOF___INT128 +typedef __int128 hge; +typedef unsigned __int128 uhge; +#define HAVE_HGE 1 +#define SIZEOF_HGE SIZEOF___INT128 +#elif defined(SIZEOF___INT128_T) && defined(SIZEOF___UINT128_T) +typedef __int128_t hge; +typedef __uint128_t uhge; +#define HAVE_HGE 1 +#define SIZEOF_HGE SIZEOF___INT128_T +#endif + +// End Section: monetdb configure sizes + +/* Does your compiler support `__attribute__' extension? */ +#if !defined(__GNUC__) && !defined(__clang__) && !defined(__attribute__) +#define __attribute__(a) +#endif + +#if !defined(__cplusplus) || __cplusplus < 201103L +#ifndef static_assert +/* static_assert is a C11/C++11 feature, defined in assert.h which also exists + * in many other compilers we ignore it if the compiler doesn't support it + * However in C11 static_assert is a macro, while on C++11 is a keyword */ +#define static_assert(expr, mesg) ((void) 0) +#endif +#endif + +#ifdef HAVE_STRINGS_H +#include /* strcasecmp */ +#endif + +#ifdef _MSC_VER + +#define strdup(s) _strdup(s) + +#ifndef strcasecmp +#define strcasecmp(x,y) _stricmp(x,y) +#endif + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 +#ifndef strncasecmp +#define strncasecmp(x,y,z) _strnicmp(x,y,z) +#endif + +#include +#ifdef lstat +#undef lstat +#endif +#define lstat _stat64 +#ifdef stat +#undef stat +#endif +#define stat _stat64 +#ifdef fstat +#undef fstat +#endif +#define fstat _fstat64 + +static inline char * +stpcpy(char *__restrict__ dst, const char *__restrict__ src) +{ + size_t i; + for (i = 0; src[i]; i++) + dst[i] = src[i]; + dst[i] = 0; + return dst + i; +} + +/* Define to 1 if the system has the type `socklen_t'. */ +#define HAVE_SOCKLEN_T 1 +/* type used by connect */ +#define socklen_t int +#define strtok_r(t,d,c) strtok_s(t,d,c) + +#define HAVE_GETOPT_LONG 1 + +/* there is something very similar to localtime_r on Windows: */ +#include +#define HAVE_LOCALTIME_R 1 +static inline struct tm * +localtime_r(const time_t *__restrict__ timep, struct tm *__restrict__ result) +{ + return localtime_s(result, timep) == 0 ? result : NULL; +} +#define HAVE_GMTIME_R 1 +static inline struct tm * +gmtime_r(const time_t *__restrict__ timep, struct tm *__restrict__ result) +{ + return gmtime_s(result, timep) == 0 ? result : NULL; +} + +/* Define if you have ctime_r(time_t*,char *buf,size_t s) */ +#define HAVE_CTIME_R 1 +#define HAVE_CTIME_R3 1 +/* there is something very similar to ctime_r on Windows: */ +#define ctime_r(t,b,s) (ctime_s(b,s,t) ? NULL : (b)) + +#endif /* _MSC_VER */ + +#define HAVE_SOCKLEN_T 1 +#ifndef _MSC_VER +#define SOCKET int +#define closesocket close +#endif + +#ifndef _In_z_ +#define _In_z_ +#endif +#ifndef _Printf_format_string_ +#define _Printf_format_string_ +#endif + +#ifdef _MSC_VER +#define _LIB_STARTUP_FUNC_(f,q) \ + static void f(void); \ + __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \ + __pragma(comment(linker,"/include:" q #f "_")) \ + static void f(void) +#ifdef _WIN64 + #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"") +#else + #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"_") +#endif +#else +#define LIB_STARTUP_FUNC(f) \ + static void f(void) __attribute__((__constructor__)); \ + static void f(void) +#endif + +#endif /* MT_SEEN_MONETDB_CONFIG_H */ diff --git a/monetdb/msys64/monetdb_config.h b/monetdb/msys64/monetdb_config.h index 2692546..3304251 100644 --- a/monetdb/msys64/monetdb_config.h +++ b/monetdb/msys64/monetdb_config.h @@ -1,473 +1,473 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. - */ -/* monetdb_config.h.in. Generated from CMakeLists.txt */ - -#ifndef MT_SEEN_MONETDB_CONFIG_H -#define MT_SEEN_MONETDB_CONFIG_H 1 - -#ifdef _MSC_VER - -#if _MSC_VER < 1900 -#error Versions below Visual Studio 2015 are no longer supported -#endif - -/* Prevent pollution through excessive inclusion of include files by Windows.h. */ -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN 1 -#endif - -/* Visual Studio 8 has deprecated lots of stuff: suppress warnings */ -#ifndef _CRT_SECURE_NO_DEPRECATE -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -#define _CRT_RAND_S /* for Windows rand_s, before stdlib.h */ -#define HAVE_RAND_S 1 - -#endif - -#if !defined(_XOPEN_SOURCE) && defined(__CYGWIN__) -#define _XOPEN_SOURCE 700 -#endif - -#include -#if defined(_MSC_VER) && defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) -/* In this case, malloc and friends are redefined in crtdbg.h to debug - * versions. We need to include stdlib.h first or else we get - * conflicting declarations. */ -#include -#endif - -#define HAVE_SYS_TYPES_H 1 -#ifdef HAVE_SYS_TYPES_H -# include -#endif - -/* standard C-99 include files */ -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER - -/* Windows include files */ -#include -#include -#include - -/* indicate to sqltypes.h that windows.h has already been included and - that it doesn't have to define Windows constants */ -#define ALREADY_HAVE_WINDOWS_TYPE 1 - -#define NATIVE_WIN32 1 - -#endif /* _MSC_VER */ - -#if !defined(WIN32) && (defined(__CYGWIN__)||defined(__MINGW32__)) -#define WIN32 1 -#endif - -// Section: monetdb configure defines -/* #undef HAVE_DISPATCH_DISPATCH_H */ -#define HAVE_DLFCN_H 1 -#define HAVE_FCNTL_H 1 -#define HAVE_IO_H 1 -/* #undef HAVE_KVM_H */ -#define HAVE_LIBGEN_H 1 -/* #undef HAVE_LIBINTL_H */ -/* #undef HAVE_MACH_MACH_INIT_H */ -/* #undef HAVE_MACH_TASK_H */ -/* #undef HAVE_MACH_O_DYLD_H */ -#define HAVE_NETDB_H 1 -#define HAVE_NETINET_IN_H 1 -#define HAVE_POLL_H 1 -/* #undef HAVE_PROCFS_H */ -#define HAVE_PWD_H 1 -#define HAVE_STRINGS_H 1 -/* #undef HAVE_STROPTS_H */ -#define HAVE_SYS_FILE_H 1 -#define HAVE_SYS_IOCTL_H 1 -/* #undef HAVE_SYS_SYSCTL_H */ -#define HAVE_SYS_MMAN_H 1 -#define HAVE_SYS_PARAM_H 1 -#define HAVE_SYS_RANDOM_H 1 -#define HAVE_SYS_RESOURCE_H 1 -#define HAVE_SYS_TIME_H 1 -#define HAVE_SYS_TIMES_H 1 -#define HAVE_SYS_UIO_H 1 -#define HAVE_SYS_UN_H 1 -#define HAVE_SYS_WAIT_H 1 -#define HAVE_TERMIOS_H 1 -#define HAVE_UNISTD_H 1 -#define HAVE_WINSOCK_H 1 -#define HAVE_SEMAPHORE_H 1 -#define HAVE_GETOPT_H 1 - -#define HAVE_STDATOMIC_H 1 - -#define HAVE_DIRENT_H 1 -#define HAVE_SYS_SOCKET_H 1 -#define HAVE_GETTIMEOFDAY 1 -#define HAVE_SYS_STAT_H 1 -#define HAVE_FDATASYNC 1 -#define HAVE_ACCEPT4 1 -#define HAVE_ASCTIME_R 1 -#define HAVE_CLOCK_GETTIME 1 -#define HAVE_CTIME_R 1 -/* #undef HAVE_DISPATCH_SEMAPHORE_CREATE */ -/* #undef HAVE_FALLOCATE */ -#define HAVE_FCNTL 1 -#define HAVE_FORK 1 -#define HAVE_FSYNC 1 -#define HAVE_FTIME 1 -#define HAVE_GETENTROPY 1 -/* #undef HAVE_GETEXECNAME */ -#define HAVE_GETLOGIN 1 -#define HAVE_GETOPT_LONG 1 -#define HAVE_GETRLIMIT 1 -#define HAVE_GETTIMEOFDAY 1 -#define HAVE_GETUID 1 -#define HAVE_GMTIME_R 1 -#define HAVE_LOCALTIME_R 1 -#define HAVE_STRERROR_R 1 -#define HAVE_LOCKF 1 -#define HAVE_MADVISE 1 -/* #undef HAVE_MREMAP */ -#define HAVE_NANOSLEEP 1 -#define HAVE_NL_LANGINFO 1 -/* #undef HAVE__NSGETEXECUTABLEPATH */ -/* #undef HAVE_PIPE2 */ -#define HAVE_POLL 1 -#define HAVE_POPEN 1 -#define HAVE_POSIX_FADVISE 1 -#define HAVE_POSIX_FALLOCATE 1 -#define HAVE_POSIX_MADVISE 1 -#define HAVE_PUTENV 1 -#define HAVE_SETSID 1 -#define HAVE_SHUTDOWN 1 -#define HAVE_SIGACTION 1 -#define HAVE_STPCPY 1 -#define HAVE_STRCASESTR 1 -#define HAVE_STRNCASECMP 1 -#define HAVE_STRPTIME 1 -#define HAVE_STRSIGNAL 1 -#define HAVE_SYSCONF 1 -/* #undef HAVE_TASK_INFO */ -#define HAVE_TIMES 1 -#define HAVE_UNAME 1 -/* #undef HAVE_SEMTIMEDOP */ -#define HAVE_PTHREAD_KILL 1 -#define HAVE_PTHREAD_SIGMASK 1 -#define HAVE_GETOPT 1 - -#define ICONV_CONST -#define FLEXIBLE_ARRAY_MEMBER -#define ENABLE_MAPI 1 -#define HAVE_MAPI 1 -// End Section: monetdb configure defines - -// Section: monetdb macro variables -/* #undef HAVE_ICONV */ -#define HAVE_PTHREAD_H 1 -/* #undef HAVE_LIBPCRE */ -/* #undef HAVE_LIBBZ2 */ -/* #undef HAVE_CURL */ -/* #undef HAVE_LIBLZMA */ -/* #undef HAVE_LIBXML */ -/* #undef HAVE_LIBZ */ -/* #undef HAVE_LIBLZ4 */ -/* #undef HAVE_PROJ */ -/* #undef HAVE_SNAPPY */ -/* #undef HAVE_FITS */ -/* #undef HAVE_VALGRIND */ -/* #undef HAVE_NETCDF */ -/* #undef HAVE_READLINE */ -/* #undef HAVE_LIBR */ -#define RHOME "/registry" -/* #undef HAVE_GEOM */ -/* #undef HAVE_SHP */ -/* #undef HAVE_LIBPY3 */ - -// #define SOCKET_LIBRARIES -#define HAVE_GETADDRINFO 1 -/* #undef HAVE_CUDF */ - -#define MAPI_PORT 50000 -#define MAPI_PORT_STR "50000" - -#ifdef _MSC_VER -#define DIR_SEP '\\' -#define PATH_SEP ';' -#define DIR_SEP_STR "\\" -#define SO_PREFIX "" -#else -#define DIR_SEP '/' -#define PATH_SEP ':' -#define DIR_SEP_STR "/" -#define SO_PREFIX "lib" -#endif -#define SO_EXT ".dll" - -#define BINDIR "C:/Program Files (x86)/MonetDB/bin" -#define LIBDIR "C:/Program Files (x86)/MonetDB/lib" -#define LOCALSTATEDIR "C:/Program Files (x86)/MonetDB/var" - -// End Section: monetdb macro variables - -// Section: monetdb configure misc -#define MONETDB_RELEASE "unreleased" - -#define MONETDB_VERSION "11.44.0" -#define MONETDB_VERSION_MAJOR 11 -#define MONETDB_VERSION_MINOR 44 -#define MONETDB_VERSION_PATCH 0 - -#define GDK_VERSION "25.1.0" -#define GDK_VERSION_MAJOR 25 -#define GDK_VERSION_MINOR 1 -#define GDK_VERSION_PATCH 0 -#define MAPI_VERSION "14.0.2" -#define MAPI_VERSION_MAJOR 14 -#define MAPI_VERSION_MINOR 0 -#define MAPI_VERSION_PATCH 2 -#define MONETDB5_VERSION "32.0.6" -#define MONETDB5_VERSION_MAJOR 32 -#define MONETDB5_VERSION_MINOR 0 -#define MONETDB5_VERSION_PATCH 6 -#define MONETDBE_VERSION "3.0.2" -#define MONETDBE_VERSION_MAJOR 3 -#define MONETDBE_VERSION_MINOR 0 -#define MONETDBE_VERSION_PATCH 2 -#define STREAM_VERSION "16.0.1" -#define STREAM_VERSION_MAJOR 16 -#define STREAM_VERSION_MINOR 0 -#define STREAM_VERSION_PATCH 1 -#define SQL_VERSION "12.0.5" -#define SQL_VERSION_MAJOR 12 -#define SQL_VERSION_MINOR 0 -#define SQL_VERSION_PATCH 5 - -/* Host identifier */ -#define HOST "amd64-pc-windows-gnu" - -/* The used password hash algorithm */ -#define MONETDB5_PASSWDHASH "SHA512" - -/* The used password hash algorithm */ -#define MONETDB5_PASSWDHASH_TOKEN SHA512 - -#ifndef _Noreturn -#ifdef __cplusplus -#define _Noreturn -#else -/* #undef _Noreturn */ -#endif -#endif -/* Does your compiler support `inline' keyword? (C99 feature) */ -#ifndef inline -#ifdef __cplusplus -#define inline -#else -/* #undef inline */ -#endif -#endif -/* Does your compiler support `restrict' keyword? (C99 feature) */ -#ifndef restrict -#ifdef __cplusplus -#define restrict -#else -/* #undef restrict */ -#endif -#endif - -// End Section: monetdb configure misc - -// Section: monetdb configure sizes -#define SIZEOF_SIZE_T 8 - -/* The size of `void *', as computed by sizeof. */ -#define SIZEOF_VOID_P 8 - -#define SIZEOF_CHAR 1 -#define SIZEOF_SHORT 2 -#define SIZEOF_INT 4 -#define SIZEOF_LONG 8 -#define SIZEOF_LONG_LONG 8 -#define SIZEOF_DOUBLE 8 -#define SIZEOF_WCHAR_T 2 -#define HAVE_LONG_LONG 1 /* for ODBC include files */ - -#ifdef _MSC_VER -#ifdef _WIN64 -#define LENP_OR_POINTER_T SQLLEN * -#else -#define LENP_OR_POINTER_T SQLPOINTER -#endif -#else -/* #undef LENP_OR_POINTER_T */ -#endif -/* #undef SIZEOF_SQLWCHAR */ - -/* #undef WORDS_BIGENDIAN */ - -/* Does your compiler support `ssize_t' type? (Posix type) */ -#ifndef ssize_t -/* #undef ssize_t */ -#endif - -/* The size of `__int128', as computed by sizeof. */ -#define SIZEOF___INT128 16 - -/* The size of `__int128_t', as computed by sizeof. */ -#define SIZEOF___INT128_T 16 - -/* The size of `__uint128_t', as computed by sizeof. */ -#define SIZEOF___UINT128_T 16 - -#define HAVE___INT128 1 -#define HAVE___INT128_T 1 -#define HAVE___UINT128_T 1 -/* #undef HAVE_HGE */ - -#ifdef HAVE_HGE -#ifdef HAVE___INT128 -typedef __int128 hge; -typedef unsigned __int128 uhge; -#define SIZEOF_HGE SIZEOF___INT128 -#elif defined(HAVE___INT128_T) && defined(HAVE___UINT128_T) -typedef __int128_t hge; -typedef __uint128_t uhge; -#define SIZEOF_HGE SIZEOF___INT128_T -#endif -#endif - -// End Section: monetdb configure sizes - -/* Does your compiler support `__attribute__' extension? */ -#if !defined(__GNUC__) && !defined(__clang__) && !defined(__attribute__) -#define __attribute__(a) -#endif - -#if !defined(__cplusplus) || __cplusplus < 201103L -#ifndef static_assert -/* static_assert is a C11/C++11 feature, defined in assert.h which also exists - * in many other compilers we ignore it if the compiler doesn't support it - * However in C11 static_assert is a macro, while on C++11 is a keyword */ -#define static_assert(expr, mesg) ((void) 0) -#endif -#endif - -#ifdef HAVE_STRINGS_H -#include /* strcasecmp */ -#endif - -#ifdef _MSC_VER - -#define strdup(s) _strdup(s) - -#ifndef strcasecmp -#define strcasecmp(x,y) _stricmp(x,y) -#endif - -/* Define to 1 if you have the `strncasecmp' function. */ -#define HAVE_STRNCASECMP 1 -#ifndef strncasecmp -#define strncasecmp(x,y,z) _strnicmp(x,y,z) -#endif - -#include -#ifdef lstat -#undef lstat -#endif -#define lstat _stat64 -#ifdef stat -#undef stat -#endif -#define stat _stat64 -#ifdef fstat -#undef fstat -#endif -#define fstat _fstat64 - -static inline char * -stpcpy(char *restrict dst, const char *restrict src) -{ - size_t i; - for (i = 0; src[i]; i++) - dst[i] = src[i]; - dst[i] = 0; - return dst + i; -} - -/* Define to 1 if the system has the type `socklen_t'. */ -#define HAVE_SOCKLEN_T 1 -/* type used by connect */ -#define socklen_t int -#define strtok_r(t,d,c) strtok_s(t,d,c) - -#define HAVE_GETOPT_LONG 1 - -/* there is something very similar to localtime_r on Windows: */ -#include -#define HAVE_LOCALTIME_R 1 -static inline struct tm * -localtime_r(const time_t *restrict timep, struct tm *restrict result) -{ - return localtime_s(result, timep) == 0 ? result : NULL; -} -#define HAVE_GMTIME_R 1 -static inline struct tm * -gmtime_r(const time_t *restrict timep, struct tm *restrict result) -{ - return gmtime_s(result, timep) == 0 ? result : NULL; -} - -/* Define if you have ctime_r(time_t*,char *buf,size_t s) */ -#define HAVE_CTIME_R 1 -#define HAVE_CTIME_R3 1 -/* there is something very similar to ctime_r on Windows: */ -#define ctime_r(t,b,s) (ctime_s(b,s,t) ? NULL : (b)) - -#endif /* _MSC_VER */ - -/* #undef HAVE_SOCKLEN_T */ -#ifndef _MSC_VER -#define SOCKET int -#define closesocket close -#endif - -#ifndef _In_z_ -#define _In_z_ -#endif -#ifndef _Printf_format_string_ -#define _Printf_format_string_ -#endif - -#ifdef _MSC_VER -#define _LIB_STARTUP_FUNC_(f,q) \ - static void f(void); \ - __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \ - __pragma(comment(linker,"/include:" q #f "_")) \ - static void f(void) -#ifdef _WIN64 - #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"") -#else - #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"_") -#endif -#else -#define LIB_STARTUP_FUNC(f) \ - static void f(void) __attribute__((__constructor__)); \ - static void f(void) -#endif - -#endif /* MT_SEEN_MONETDB_CONFIG_H */ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. + */ +/* monetdb_config.h.in. Generated from CMakeLists.txt */ + +#ifndef MT_SEEN_MONETDB_CONFIG_H +#define MT_SEEN_MONETDB_CONFIG_H 1 + +#ifdef _MSC_VER + +#if _MSC_VER < 1900 +#error Versions below Visual Studio 2015 are no longer supported +#endif + +/* Prevent pollution through excessive inclusion of include files by Windows.h. */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif + +/* Visual Studio 8 has deprecated lots of stuff: suppress warnings */ +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE 1 +#endif + +#define _CRT_RAND_S /* for Windows rand_s, before stdlib.h */ +#define HAVE_RAND_S 1 + +#endif + +#if !defined(_XOPEN_SOURCE) && defined(__CYGWIN__) +#define _XOPEN_SOURCE 700 +#endif + +#include +#if defined(_MSC_VER) && defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) +/* In this case, malloc and friends are redefined in crtdbg.h to debug + * versions. We need to include stdlib.h first or else we get + * conflicting declarations. */ +#include +#endif + +#define HAVE_SYS_TYPES_H 1 +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +/* standard C-99 include files */ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER + +/* Windows include files */ +#include +#include +#include + +/* indicate to sqltypes.h that windows.h has already been included and + that it doesn't have to define Windows constants */ +#define ALREADY_HAVE_WINDOWS_TYPE 1 + +#define NATIVE_WIN32 1 + +#endif /* _MSC_VER */ + +#if !defined(WIN32) && (defined(__CYGWIN__)||defined(__MINGW32__)) +#define WIN32 1 +#endif + +// Section: monetdb configure defines +/* #undef HAVE_DISPATCH_DISPATCH_H */ +#define HAVE_DLFCN_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_IO_H 1 +/* #undef HAVE_KVM_H */ +#define HAVE_LIBGEN_H 1 +/* #undef HAVE_LIBINTL_H */ +/* #undef HAVE_MACH_MACH_INIT_H */ +/* #undef HAVE_MACH_TASK_H */ +/* #undef HAVE_MACH_O_DYLD_H */ +#define HAVE_NETDB_H 1 +#define HAVE_NETINET_IN_H 1 +#define HAVE_POLL_H 1 +/* #undef HAVE_PROCFS_H */ +#define HAVE_PWD_H 1 +#define HAVE_STRINGS_H 1 +/* #undef HAVE_STROPTS_H */ +#define HAVE_SYS_FILE_H 1 +#define HAVE_SYS_IOCTL_H 1 +/* #undef HAVE_SYS_SYSCTL_H */ +#define HAVE_SYS_MMAN_H 1 +#define HAVE_SYS_PARAM_H 1 +#define HAVE_SYS_RANDOM_H 1 +#define HAVE_SYS_RESOURCE_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_TIMES_H 1 +#define HAVE_SYS_UIO_H 1 +#define HAVE_SYS_UN_H 1 +#define HAVE_SYS_WAIT_H 1 +#define HAVE_TERMIOS_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_WINSOCK_H 1 +#define HAVE_SEMAPHORE_H 1 +#define HAVE_GETOPT_H 1 + +#define HAVE_STDATOMIC_H 1 + +#define HAVE_DIRENT_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_FDATASYNC 1 +#define HAVE_ACCEPT4 1 +#define HAVE_ASCTIME_R 1 +#define HAVE_CLOCK_GETTIME 1 +#define HAVE_CTIME_R 1 +/* #undef HAVE_DISPATCH_SEMAPHORE_CREATE */ +/* #undef HAVE_FALLOCATE */ +#define HAVE_FCNTL 1 +#define HAVE_FORK 1 +#define HAVE_FSYNC 1 +#define HAVE_FTIME 1 +#define HAVE_GETENTROPY 1 +/* #undef HAVE_GETEXECNAME */ +#define HAVE_GETLOGIN 1 +#define HAVE_GETOPT_LONG 1 +#define HAVE_GETRLIMIT 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_GETUID 1 +#define HAVE_GMTIME_R 1 +#define HAVE_LOCALTIME_R 1 +#define HAVE_STRERROR_R 1 +#define HAVE_LOCKF 1 +#define HAVE_MADVISE 1 +/* #undef HAVE_MREMAP */ +#define HAVE_NANOSLEEP 1 +#define HAVE_NL_LANGINFO 1 +/* #undef HAVE__NSGETEXECUTABLEPATH */ +/* #undef HAVE_PIPE2 */ +#define HAVE_POLL 1 +#define HAVE_POPEN 1 +#define HAVE_POSIX_FADVISE 1 +#define HAVE_POSIX_FALLOCATE 1 +#define HAVE_POSIX_MADVISE 1 +#define HAVE_PUTENV 1 +#define HAVE_SETSID 1 +#define HAVE_SHUTDOWN 1 +#define HAVE_SIGACTION 1 +#define HAVE_STPCPY 1 +#define HAVE_STRCASESTR 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_STRPTIME 1 +#define HAVE_STRSIGNAL 1 +#define HAVE_SYSCONF 1 +/* #undef HAVE_TASK_INFO */ +#define HAVE_TIMES 1 +#define HAVE_UNAME 1 +/* #undef HAVE_SEMTIMEDOP */ +#define HAVE_PTHREAD_KILL 1 +#define HAVE_PTHREAD_SIGMASK 1 +#define HAVE_GETOPT 1 + +#define ICONV_CONST +#define FLEXIBLE_ARRAY_MEMBER +#define ENABLE_MAPI 1 +#define HAVE_MAPI 1 +// End Section: monetdb configure defines + +// Section: monetdb macro variables +/* #undef HAVE_ICONV */ +#define HAVE_PTHREAD_H 1 +/* #undef HAVE_LIBPCRE */ +/* #undef HAVE_LIBBZ2 */ +/* #undef HAVE_CURL */ +/* #undef HAVE_LIBLZMA */ +/* #undef HAVE_LIBXML */ +/* #undef HAVE_LIBZ */ +/* #undef HAVE_LIBLZ4 */ +/* #undef HAVE_PROJ */ +/* #undef HAVE_SNAPPY */ +/* #undef HAVE_FITS */ +/* #undef HAVE_VALGRIND */ +/* #undef HAVE_NETCDF */ +/* #undef HAVE_READLINE */ +/* #undef HAVE_LIBR */ +#define RHOME "/registry" +/* #undef HAVE_GEOM */ +/* #undef HAVE_SHP */ +/* #undef HAVE_LIBPY3 */ + +// #define SOCKET_LIBRARIES +#define HAVE_GETADDRINFO 1 +/* #undef HAVE_CUDF */ + +#define MAPI_PORT 50000 +#define MAPI_PORT_STR "50000" + +#ifdef _MSC_VER +#define DIR_SEP '\\' +#define PATH_SEP ';' +#define DIR_SEP_STR "\\" +#define SO_PREFIX "" +#else +#define DIR_SEP '/' +#define PATH_SEP ':' +#define DIR_SEP_STR "/" +#define SO_PREFIX "lib" +#endif +#define SO_EXT ".dll" + +#define BINDIR "C:/Program Files (x86)/MonetDB/bin" +#define LIBDIR "C:/Program Files (x86)/MonetDB/lib" +#define LOCALSTATEDIR "C:/Program Files (x86)/MonetDB/var" + +// End Section: monetdb macro variables + +// Section: monetdb configure misc +#define MONETDB_RELEASE "unreleased" + +#define MONETDB_VERSION "11.44.0" +#define MONETDB_VERSION_MAJOR 11 +#define MONETDB_VERSION_MINOR 44 +#define MONETDB_VERSION_PATCH 0 + +#define GDK_VERSION "25.1.0" +#define GDK_VERSION_MAJOR 25 +#define GDK_VERSION_MINOR 1 +#define GDK_VERSION_PATCH 0 +#define MAPI_VERSION "14.0.2" +#define MAPI_VERSION_MAJOR 14 +#define MAPI_VERSION_MINOR 0 +#define MAPI_VERSION_PATCH 2 +#define MONETDB5_VERSION "32.0.6" +#define MONETDB5_VERSION_MAJOR 32 +#define MONETDB5_VERSION_MINOR 0 +#define MONETDB5_VERSION_PATCH 6 +#define MONETDBE_VERSION "3.0.2" +#define MONETDBE_VERSION_MAJOR 3 +#define MONETDBE_VERSION_MINOR 0 +#define MONETDBE_VERSION_PATCH 2 +#define STREAM_VERSION "16.0.1" +#define STREAM_VERSION_MAJOR 16 +#define STREAM_VERSION_MINOR 0 +#define STREAM_VERSION_PATCH 1 +#define SQL_VERSION "12.0.5" +#define SQL_VERSION_MAJOR 12 +#define SQL_VERSION_MINOR 0 +#define SQL_VERSION_PATCH 5 + +/* Host identifier */ +#define HOST "amd64-pc-windows-gnu" + +/* The used password hash algorithm */ +#define MONETDB5_PASSWDHASH "SHA512" + +/* The used password hash algorithm */ +#define MONETDB5_PASSWDHASH_TOKEN SHA512 + +#ifndef _Noreturn +#ifdef __cplusplus +#define _Noreturn +#else +/* #undef _Noreturn */ +#endif +#endif +/* Does your compiler support `inline' keyword? (C99 feature) */ +#ifndef inline +#ifdef __cplusplus +#define inline +#else +/* #undef inline */ +#endif +#endif +/* Does your compiler support `restrict' keyword? (C99 feature) */ +#ifndef restrict +#ifdef __cplusplus +#define restrict +#else +/* #undef restrict */ +#endif +#endif + +// End Section: monetdb configure misc + +// Section: monetdb configure sizes +#define SIZEOF_SIZE_T 8 + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P 8 + +#define SIZEOF_CHAR 1 +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 8 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_WCHAR_T 2 +#define HAVE_LONG_LONG 1 /* for ODBC include files */ + +#ifdef _MSC_VER +#ifdef _WIN64 +#define LENP_OR_POINTER_T SQLLEN * +#else +#define LENP_OR_POINTER_T SQLPOINTER +#endif +#else +/* #undef LENP_OR_POINTER_T */ +#endif +/* #undef SIZEOF_SQLWCHAR */ + +/* #undef WORDS_BIGENDIAN */ + +/* Does your compiler support `ssize_t' type? (Posix type) */ +#ifndef ssize_t +/* #undef ssize_t */ +#endif + +/* The size of `__int128', as computed by sizeof. */ +#define SIZEOF___INT128 16 + +/* The size of `__int128_t', as computed by sizeof. */ +#define SIZEOF___INT128_T 16 + +/* The size of `__uint128_t', as computed by sizeof. */ +#define SIZEOF___UINT128_T 16 + +#define HAVE___INT128 1 +#define HAVE___INT128_T 1 +#define HAVE___UINT128_T 1 +/* #undef HAVE_HGE */ + +#ifdef HAVE_HGE +#ifdef HAVE___INT128 +typedef __int128 hge; +typedef unsigned __int128 uhge; +#define SIZEOF_HGE SIZEOF___INT128 +#elif defined(HAVE___INT128_T) && defined(HAVE___UINT128_T) +typedef __int128_t hge; +typedef __uint128_t uhge; +#define SIZEOF_HGE SIZEOF___INT128_T +#endif +#endif + +// End Section: monetdb configure sizes + +/* Does your compiler support `__attribute__' extension? */ +#if !defined(__GNUC__) && !defined(__clang__) && !defined(__attribute__) +#define __attribute__(a) +#endif + +#if !defined(__cplusplus) || __cplusplus < 201103L +#ifndef static_assert +/* static_assert is a C11/C++11 feature, defined in assert.h which also exists + * in many other compilers we ignore it if the compiler doesn't support it + * However in C11 static_assert is a macro, while on C++11 is a keyword */ +#define static_assert(expr, mesg) ((void) 0) +#endif +#endif + +#ifdef HAVE_STRINGS_H +#include /* strcasecmp */ +#endif + +#ifdef _MSC_VER + +#define strdup(s) _strdup(s) + +#ifndef strcasecmp +#define strcasecmp(x,y) _stricmp(x,y) +#endif + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 +#ifndef strncasecmp +#define strncasecmp(x,y,z) _strnicmp(x,y,z) +#endif + +#include +#ifdef lstat +#undef lstat +#endif +#define lstat _stat64 +#ifdef stat +#undef stat +#endif +#define stat _stat64 +#ifdef fstat +#undef fstat +#endif +#define fstat _fstat64 + +static inline char * +stpcpy(char *restrict dst, const char *restrict src) +{ + size_t i; + for (i = 0; src[i]; i++) + dst[i] = src[i]; + dst[i] = 0; + return dst + i; +} + +/* Define to 1 if the system has the type `socklen_t'. */ +#define HAVE_SOCKLEN_T 1 +/* type used by connect */ +#define socklen_t int +#define strtok_r(t,d,c) strtok_s(t,d,c) + +#define HAVE_GETOPT_LONG 1 + +/* there is something very similar to localtime_r on Windows: */ +#include +#define HAVE_LOCALTIME_R 1 +static inline struct tm * +localtime_r(const time_t *restrict timep, struct tm *restrict result) +{ + return localtime_s(result, timep) == 0 ? result : NULL; +} +#define HAVE_GMTIME_R 1 +static inline struct tm * +gmtime_r(const time_t *restrict timep, struct tm *restrict result) +{ + return gmtime_s(result, timep) == 0 ? result : NULL; +} + +/* Define if you have ctime_r(time_t*,char *buf,size_t s) */ +#define HAVE_CTIME_R 1 +#define HAVE_CTIME_R3 1 +/* there is something very similar to ctime_r on Windows: */ +#define ctime_r(t,b,s) (ctime_s(b,s,t) ? NULL : (b)) + +#endif /* _MSC_VER */ + +/* #undef HAVE_SOCKLEN_T */ +#ifndef _MSC_VER +#define SOCKET int +#define closesocket close +#endif + +#ifndef _In_z_ +#define _In_z_ +#endif +#ifndef _Printf_format_string_ +#define _Printf_format_string_ +#endif + +#ifdef _MSC_VER +#define _LIB_STARTUP_FUNC_(f,q) \ + static void f(void); \ + __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \ + __pragma(comment(linker,"/include:" q #f "_")) \ + static void f(void) +#ifdef _WIN64 + #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"") +#else + #define LIB_STARTUP_FUNC(f) _LIB_STARTUP_FUNC_(f,"_") +#endif +#else +#define LIB_STARTUP_FUNC(f) \ + static void f(void) __attribute__((__constructor__)); \ + static void f(void) +#endif + +#endif /* MT_SEEN_MONETDB_CONFIG_H */ diff --git a/monetdb/msys64/monetdbe.h b/monetdb/msys64/monetdbe.h index 5c6df57..614a540 100644 --- a/monetdb/msys64/monetdbe.h +++ b/monetdb/msys64/monetdbe.h @@ -1,190 +1,190 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. - */ - -#ifndef _MONETDBE_LIB_ -#define _MONETDBE_LIB_ - -#include "monetdb_config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#ifdef WIN32 -#ifndef LIBMONETDBE -#define monetdbe_export extern __declspec(dllimport) -#else -#define monetdbe_export extern __declspec(dllexport) -#endif -#else -#define monetdbe_export extern -#endif - -typedef int64_t monetdbe_cnt; - -typedef struct { - unsigned char day; - unsigned char month; - short year; -} monetdbe_data_date; - -typedef struct { - unsigned int ms; - unsigned char seconds; - unsigned char minutes; - unsigned char hours; -} monetdbe_data_time; - -typedef struct { - monetdbe_data_date date; - monetdbe_data_time time; -} monetdbe_data_timestamp; - -typedef struct { - size_t size; - char* data; -} monetdbe_data_blob; - -typedef enum { - monetdbe_bool, monetdbe_int8_t, monetdbe_int16_t, monetdbe_int32_t, monetdbe_int64_t, -#ifdef HAVE_HGE - monetdbe_int128_t, -#endif - monetdbe_size_t, monetdbe_float, monetdbe_double, - monetdbe_str, monetdbe_blob, - monetdbe_date, monetdbe_time, monetdbe_timestamp, - - // should be last: - monetdbe_type_unknown -} monetdbe_types; - -typedef struct { - char* name; - unsigned int scale; - unsigned int digits; -} monetdbe_sql_type; - -typedef struct { - monetdbe_types type; - monetdbe_sql_type sql_type; - void *data; - size_t count; - char* name; -} monetdbe_column; - -typedef struct { - size_t nparam; - monetdbe_types *type; -} monetdbe_statement; - -typedef struct { - monetdbe_cnt nrows; - size_t ncols; - char *name; - monetdbe_cnt last_id; /* last auto incremented id */ -} monetdbe_result; - -typedef void* monetdbe_database; - -typedef struct { - const char *host; - int port; - const char *database; - const char *username; - const char *password; - const char *lang; -} monetdbe_remote; - -typedef struct { - const char *host; - const char* port; - const char* usock; -} monetdbe_mapi_server; - -typedef struct { - int memorylimit; // top off the amount of RAM to be used, in MB - int querytimeout; // graceful terminate query after a few seconds - int sessiontimeout; // graceful terminate the session after a few seconds - int nr_threads; // maximum number of worker treads, limits level of parallelism - monetdbe_remote* remote; - monetdbe_mapi_server* mapi_server; - const char *trace_file; // file to which log output should be written -} monetdbe_options; - -#define DEFAULT_STRUCT_DEFINITION(ctype, typename) \ - typedef struct \ - { \ - monetdbe_types type; \ - monetdbe_sql_type sql_type; \ - ctype *data; \ - size_t count; \ - char *name; \ - ctype null_value; \ - double scale; \ - int (*is_null)(ctype *value); \ - } monetdbe_column_##typename - -DEFAULT_STRUCT_DEFINITION(int8_t, bool); -DEFAULT_STRUCT_DEFINITION(int8_t, int8_t); -DEFAULT_STRUCT_DEFINITION(int16_t, int16_t); -DEFAULT_STRUCT_DEFINITION(int32_t, int32_t); -DEFAULT_STRUCT_DEFINITION(int64_t, int64_t); -#ifdef HAVE_HGE -DEFAULT_STRUCT_DEFINITION(__int128, int128_t); -#endif -DEFAULT_STRUCT_DEFINITION(size_t, size_t); - -DEFAULT_STRUCT_DEFINITION(float, float); -DEFAULT_STRUCT_DEFINITION(double, double); - -DEFAULT_STRUCT_DEFINITION(char *, str); -DEFAULT_STRUCT_DEFINITION(monetdbe_data_blob, blob); - -DEFAULT_STRUCT_DEFINITION(monetdbe_data_date, date); -DEFAULT_STRUCT_DEFINITION(monetdbe_data_time, time); -DEFAULT_STRUCT_DEFINITION(monetdbe_data_timestamp, timestamp); -// UUID, INET, XML ? - -monetdbe_export const char *monetdbe_version(void); - -monetdbe_export int monetdbe_open(monetdbe_database *db, char *url, monetdbe_options *opts); -/* 0 ok, -1 (allocation failed), -2 error in db */ -monetdbe_export int monetdbe_close(monetdbe_database db); - -monetdbe_export char* monetdbe_error(monetdbe_database db); - -monetdbe_export char* monetdbe_get_autocommit(monetdbe_database dbhdl, int* result); -monetdbe_export char* monetdbe_set_autocommit(monetdbe_database dbhdl, int value); -monetdbe_export int monetdbe_in_transaction(monetdbe_database dbhdl); - -monetdbe_export char* monetdbe_query(monetdbe_database dbhdl, char* query, monetdbe_result** result, monetdbe_cnt* affected_rows); -monetdbe_export char* monetdbe_result_fetch(monetdbe_result *mres, monetdbe_column** res, size_t column_index); -monetdbe_export char* monetdbe_cleanup_result(monetdbe_database dbhdl, monetdbe_result* result); - -monetdbe_export char* monetdbe_prepare(monetdbe_database dbhdl, char *query, monetdbe_statement **stmt, monetdbe_result** result); -monetdbe_export char* monetdbe_bind(monetdbe_statement *stmt, void *data, size_t parameter_nr); -monetdbe_export char* monetdbe_execute(monetdbe_statement *stmt, monetdbe_result **result, monetdbe_cnt* affected_rows); -monetdbe_export char* monetdbe_cleanup_statement(monetdbe_database dbhdl, monetdbe_statement *stmt); - -monetdbe_export char* monetdbe_append(monetdbe_database dbhdl, const char* schema, const char* table, monetdbe_column **input, size_t column_count); -monetdbe_export const void* monetdbe_null(monetdbe_database dbhdl, monetdbe_types t); - -monetdbe_export char* monetdbe_get_columns(monetdbe_database dbhdl, const char* schema_name, const char *table_name, size_t *column_count, monetdbe_column **columns); - -monetdbe_export char* monetdbe_dump_database(monetdbe_database dbhdl, const char *backupfile); -monetdbe_export char* monetdbe_dump_table(monetdbe_database dbhdl, const char *schema_name, const char *table_name, const char *backupfile); -monetdbe_export const char* monetdbe_get_mapi_port(void); - -#ifdef __cplusplus -} -#endif - - -#endif +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. + */ + +#ifndef _MONETDBE_LIB_ +#define _MONETDBE_LIB_ + +#include "monetdb_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef WIN32 +#ifndef LIBMONETDBE +#define monetdbe_export extern __declspec(dllimport) +#else +#define monetdbe_export extern __declspec(dllexport) +#endif +#else +#define monetdbe_export extern +#endif + +typedef int64_t monetdbe_cnt; + +typedef struct { + unsigned char day; + unsigned char month; + short year; +} monetdbe_data_date; + +typedef struct { + unsigned int ms; + unsigned char seconds; + unsigned char minutes; + unsigned char hours; +} monetdbe_data_time; + +typedef struct { + monetdbe_data_date date; + monetdbe_data_time time; +} monetdbe_data_timestamp; + +typedef struct { + size_t size; + char* data; +} monetdbe_data_blob; + +typedef enum { + monetdbe_bool, monetdbe_int8_t, monetdbe_int16_t, monetdbe_int32_t, monetdbe_int64_t, +#ifdef HAVE_HGE + monetdbe_int128_t, +#endif + monetdbe_size_t, monetdbe_float, monetdbe_double, + monetdbe_str, monetdbe_blob, + monetdbe_date, monetdbe_time, monetdbe_timestamp, + + // should be last: + monetdbe_type_unknown +} monetdbe_types; + +typedef struct { + char* name; + unsigned int scale; + unsigned int digits; +} monetdbe_sql_type; + +typedef struct { + monetdbe_types type; + monetdbe_sql_type sql_type; + void *data; + size_t count; + char* name; +} monetdbe_column; + +typedef struct { + size_t nparam; + monetdbe_types *type; +} monetdbe_statement; + +typedef struct { + monetdbe_cnt nrows; + size_t ncols; + char *name; + monetdbe_cnt last_id; /* last auto incremented id */ +} monetdbe_result; + +typedef void* monetdbe_database; + +typedef struct { + const char *host; + int port; + const char *database; + const char *username; + const char *password; + const char *lang; +} monetdbe_remote; + +typedef struct { + const char *host; + const char* port; + const char* usock; +} monetdbe_mapi_server; + +typedef struct { + int memorylimit; // top off the amount of RAM to be used, in MB + int querytimeout; // graceful terminate query after a few seconds + int sessiontimeout; // graceful terminate the session after a few seconds + int nr_threads; // maximum number of worker treads, limits level of parallelism + monetdbe_remote* remote; + monetdbe_mapi_server* mapi_server; + const char *trace_file; // file to which log output should be written +} monetdbe_options; + +#define DEFAULT_STRUCT_DEFINITION(ctype, typename) \ + typedef struct \ + { \ + monetdbe_types type; \ + monetdbe_sql_type sql_type; \ + ctype *data; \ + size_t count; \ + char *name; \ + ctype null_value; \ + double scale; \ + int (*is_null)(ctype *value); \ + } monetdbe_column_##typename + +DEFAULT_STRUCT_DEFINITION(int8_t, bool); +DEFAULT_STRUCT_DEFINITION(int8_t, int8_t); +DEFAULT_STRUCT_DEFINITION(int16_t, int16_t); +DEFAULT_STRUCT_DEFINITION(int32_t, int32_t); +DEFAULT_STRUCT_DEFINITION(int64_t, int64_t); +#ifdef HAVE_HGE +DEFAULT_STRUCT_DEFINITION(__int128, int128_t); +#endif +DEFAULT_STRUCT_DEFINITION(size_t, size_t); + +DEFAULT_STRUCT_DEFINITION(float, float); +DEFAULT_STRUCT_DEFINITION(double, double); + +DEFAULT_STRUCT_DEFINITION(char *, str); +DEFAULT_STRUCT_DEFINITION(monetdbe_data_blob, blob); + +DEFAULT_STRUCT_DEFINITION(monetdbe_data_date, date); +DEFAULT_STRUCT_DEFINITION(monetdbe_data_time, time); +DEFAULT_STRUCT_DEFINITION(monetdbe_data_timestamp, timestamp); +// UUID, INET, XML ? + +monetdbe_export const char *monetdbe_version(void); + +monetdbe_export int monetdbe_open(monetdbe_database *db, char *url, monetdbe_options *opts); +/* 0 ok, -1 (allocation failed), -2 error in db */ +monetdbe_export int monetdbe_close(monetdbe_database db); + +monetdbe_export char* monetdbe_error(monetdbe_database db); + +monetdbe_export char* monetdbe_get_autocommit(monetdbe_database dbhdl, int* result); +monetdbe_export char* monetdbe_set_autocommit(monetdbe_database dbhdl, int value); +monetdbe_export int monetdbe_in_transaction(monetdbe_database dbhdl); + +monetdbe_export char* monetdbe_query(monetdbe_database dbhdl, char* query, monetdbe_result** result, monetdbe_cnt* affected_rows); +monetdbe_export char* monetdbe_result_fetch(monetdbe_result *mres, monetdbe_column** res, size_t column_index); +monetdbe_export char* monetdbe_cleanup_result(monetdbe_database dbhdl, monetdbe_result* result); + +monetdbe_export char* monetdbe_prepare(monetdbe_database dbhdl, char *query, monetdbe_statement **stmt, monetdbe_result** result); +monetdbe_export char* monetdbe_bind(monetdbe_statement *stmt, void *data, size_t parameter_nr); +monetdbe_export char* monetdbe_execute(monetdbe_statement *stmt, monetdbe_result **result, monetdbe_cnt* affected_rows); +monetdbe_export char* monetdbe_cleanup_statement(monetdbe_database dbhdl, monetdbe_statement *stmt); + +monetdbe_export char* monetdbe_append(monetdbe_database dbhdl, const char* schema, const char* table, monetdbe_column **input, size_t column_count); +monetdbe_export const void* monetdbe_null(monetdbe_database dbhdl, monetdbe_types t); + +monetdbe_export char* monetdbe_get_columns(monetdbe_database dbhdl, const char* schema_name, const char *table_name, size_t *column_count, monetdbe_column **columns); + +monetdbe_export char* monetdbe_dump_database(monetdbe_database dbhdl, const char *backupfile); +monetdbe_export char* monetdbe_dump_table(monetdbe_database dbhdl, const char *schema_name, const char *table_name, const char *backupfile); +monetdbe_export const char* monetdbe_get_mapi_port(void); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/msc-plugin/zlib1.dll b/msc-plugin/zlib1.dll new file mode 100644 index 0000000..bc7d155 Binary files /dev/null and b/msc-plugin/zlib1.dll differ diff --git a/out.cpp b/out.cpp index edd85df..22b8a1a 100644 --- a/out.cpp +++ b/out.cpp @@ -1,21 +1,31 @@ -#include "./server/libaquery.h" +#include "./server/aggregations.h" #include "./udf.hpp" +#include "./server/hasher.h" +#include #include "./server/monetdb_conn.h" -#include "./server/aggregations.h" +#include "./server/libaquery.h" extern "C" int __DLLEXPORT__ dllmain(Context* cxt) { using namespace std; using namespace types; auto server = static_cast(cxt->alt_server); - auto len_6WMRXO = server->cnt; -auto suma_6BP = ColRef(len_6WMRXO, server->getCol(0)); -auto b_5Yb = ColRef(len_6WMRXO, server->getCol(1)); -auto c_2Vh = ColRef(len_6WMRXO, server->getCol(2)); -auto d_1Ma = ColRef(len_6WMRXO, server->getCol(3)); -auto out_2URo7p = new TableInfo>,int64_t,int>("out_2URo7p"); -out_2URo7p->get_col<0>() = (paircorr(c_2Vh, b_5Yb) * d_1Ma); -out_2URo7p->get_col<1>().initfrom(suma_6BP); -out_2URo7p->get_col<2>().initfrom(b_5Yb); -print(*out_2URo7p); + auto len_4fxytV = server->cnt; +auto b_3pr = ColRef(len_4fxytV, server->getCol(0)); +auto a_65L = ColRef(len_4fxytV, server->getCol(1)); +auto out_2UnEpP = new TableInfo>>("out_2UnEpP"); +auto col_C9QF0Z = out_2UnEpP->get_col<0>(); +for (uint32_t i41 = 0; i41 < t1K4f4I0.size; ++i41){ +g1zdpLFa[forward_as_tuple(t1K4f4I0[i41])].emplace_back(i41); +} +for (const auto& i40 : g1zdpLFa){ +auto &len_5NTOM6m = val_2423Z8E.size; +auto &key_6fZPUDS = i4O.first; +auto &val_2423Z8E = i4O.second; +col_C9QF0Z.emplace_back({len_5NTOM6m}); + +covariances2(a_65L[val_2423Z8E], b_3pr[val_2423Z8E], 4, len_5NTOM6m, col_C9QF0Z.back()); + +} +print(*out_2UnEpP); return 0; } \ No newline at end of file diff --git a/prompt.py b/prompt.py index 339e252..8fcef75 100644 --- a/prompt.py +++ b/prompt.py @@ -34,13 +34,17 @@ server_mode = RunType.Threaded server_bin = 'server.bin' if server_mode == RunType.IPC else 'server.so' -try: - os.remove(server_bin) -except Exception as e: - print(type(e), e) + nullstream = open(os.devnull, 'w') -subprocess.call(['make', server_bin], stdout=nullstream) + +if aquery_config.rebuild_backend: + try: + os.remove(server_bin) + except Exception as e: + print(type(e), e) + subprocess.call(['make', server_bin], stdout=nullstream) + cleanup = True def rm(): @@ -157,12 +161,12 @@ def init_threaded(): else: os.environ['PATH'] = os.environ['PATH'] + os.pathsep + os.path.abspath('.') os.environ['PATH'] = os.environ['PATH'] + os.pathsep + os.path.abspath('./lib') - - server_so = ctypes.CDLL('./'+server_bin) - global cfg, th, send - send = server_so['receive_args'] - th = threading.Thread(target=server_so['main'], args=(-1, ctypes.POINTER(ctypes.c_char_p)(cfg.c)), daemon=True) - th.start() + if aquery_config.run_backend: + server_so = ctypes.CDLL('./'+server_bin) + global cfg, th, send + send = server_so['receive_args'] + th = threading.Thread(target=server_so['main'], args=(-1, ctypes.POINTER(ctypes.c_char_p)(cfg.c)), daemon=True) + th.start() if server_mode == RunType.IPC: atexit.register(rm) @@ -180,8 +184,11 @@ else: global cfg cfg.new_query = 1 set_ready = __set_ready - get_ready = lambda:cfg.new_query - server_status = lambda : not th.is_alive() + get_ready = lambda: aquery_config.run_backend and cfg.new_query + if aquery_config.run_backend: + server_status = lambda : not th.is_alive() + else: + server_status = lambda : True init() test_parser = True @@ -221,7 +228,10 @@ while test_parser: qs = [ctypes.c_char_p(bytes(q, 'utf-8')) for q in sqls if len(q)] sz = len(qs) payload = (ctypes.c_char_p*sz)(*qs) - send(sz, payload) + try: + send(sz, payload) + except TypeError as e: + print(e) if cxt.udf is not None: with open('udf.hpp', 'wb') as outfile: outfile.write(cxt.udf.encode('utf-8')) @@ -237,19 +247,18 @@ while test_parser: continue - elif q == 'dbg': import code - var = globals().copy() - var.update(locals()) + from copy import deepcopy + var = {**globals(), **locals()} sh = code.InteractiveConsole(var) try: - code.interact() + sh.interact(banner = 'debugging session began.', exitmsg = 'debugging session ended.') except BaseException as e: # don't care about anything happened in interactive console - pass + print(e.with_traceback()) elif q.startswith('log'): - qs = re.split(' |\t', q) + qs = re.split(r'[ \t]', q) if len(qs) > 1: cxt.log_level = qs[1] else: @@ -276,7 +285,7 @@ while test_parser: set_ready() continue elif q.startswith('save'): - filename = re.split(' |\t', q) + filename = re.split(r'[ \t]', q) if (len(filename) > 1): filename = filename[1] else: diff --git a/python3.exe.stackdump b/python3.exe.stackdump deleted file mode 100644 index 2b87c13..0000000 --- a/python3.exe.stackdump +++ /dev/null @@ -1,32 +0,0 @@ -Exception: STATUS_ACCESS_VIOLATION at rip=005A43E1EE8 -rax=000000080016C970 rbx=00000000FFFFC2E0 rcx=0000000000000015 -rdx=00000000FFFFCE00 rsi=0000000000000000 rdi=0000000000000002 -r8 =00000000000000A8 r9 =000000080016C970 r10=0000000000005150 -r11=000000080016C970 r12=00000000FFFFFFFF r13=0000000000000000 -r14=00006FFFFFEBA2F8 r15=00000000FFFFC380 -rbp=00000000FFFFC210 rsp=00000000FFFFC160 -program=C:\msys64\usr\bin\python3.exe, pid 821, thread main -cs=0033 ds=002B es=002B fs=0053 gs=002B ss=002B -Stack trace: -Frame Function Args -000FFFFC210 005A43E1EE8 (00000000000, 0057B699D00, 00000000050, 000FFFFC2A0) -000FFFFC210 00487B249A1 (0000000000A, 000FFFFC2F0, 00000000002, 000FFFFC3A0) -000FFFFC2A0 00487B245EE (000FFFC68F0, 00000000002, 6FFFFFEBA2F8, 00000000000) -000FFFFC3A0 00487B247B2 (004484CACEA, 00800187A50, 004484CACDA, 000FFFFC2D0) -000FFFFC3A0 004484CAE74 (0057B4D31A2, 00500001101, 00000000000, 00800187A50) -00000000000 004484C476D (6FFFFFF97DF0, 00000000000, 0057B539C7B, 6FFFFFE9AF40) -004484C4660 0057B509F6F (6FFFFFFC68F0, 6FFFFFEA2330, 0057B547BA7, 00000000000) -00800048F80 0057B6910D9 (0080016ABE0, 6FFF00000000, 0057B68A0EA, 0057B72B2E0) -00000000000 0057B5D0C61 (6FFFFFE9F190, 000FFFFC7F0, 0057B5E3A05, 00000000000) -6FFFFFF30220 0057B5D0FD1 (0080016ABF0, 6FFFFFF93D30, 0057B618338, 6FFFFFF34D00) -6FFFFFF30220 0057B60C6B0 (6FFFFFE9A0B0, 0080004A920, 6FFFFFE9F190, 6FFFFFEE2610) -6FFFFFF30220 0057B60C8B4 (0057B50A49A, 00000000000, 0057B539B2F, 000FFFFCAB8) -6FFFFFF30220 0057B60EE21 (00000000000, 000FFFFCAB8, 00000000001, 0057B731792) -0057B699678 0057B60F0B6 (0057B618804, 000FFFFCD30, 0057B604F54, 00800049350) -000FFFFCD30 0057B60FA20 (00000000000, 000FFFFC968, 000FFFFCD30, 00000000001) -000FFFFCD30 0057B62ABDD (001004016D0, 001004016D0, 00000000000, 000FFFFCD30) -000FFFFCD30 0057B62AE9D (00180049B25, 00180048A40, 00000000002, 00180326FE0) -000FFFFCD30 00180049B91 (00000000000, 00000000000, 00000000000, 00000000000) -000FFFFFFF0 00180047716 (00000000000, 00000000000, 00000000000, 00000000000) -000FFFFFFF0 001800477C4 (00000000000, 00000000000, 00000000000, 00000000000) -End of stack trace diff --git a/reconstruct/TODO.md b/reconstruct/TODO.md new file mode 100644 index 0000000..f0c16b4 --- /dev/null +++ b/reconstruct/TODO.md @@ -0,0 +1,11 @@ +# TODO: + +## 1. double scans in projections + - first for special aggrigations and singular columns + - Then in group by node decide if we have special group by aggregations + - If sp_gb_agg exists, the entire groupby aggregation is done in C plugin + - If not, group by is done in SQL + +## 2. ColRef supports multiple objects + - A.a = B.b then in projection A.a B.b will refer to same projection + - Colref::ProjEq(ColRef v) => this == v or v in this.proj_eqs \ No newline at end of file diff --git a/reconstruct/ast.py b/reconstruct/ast.py index 9c57b95..1ad03eb 100644 --- a/reconstruct/ast.py +++ b/reconstruct/ast.py @@ -1,7 +1,9 @@ -from re import T -from typing import Set, Tuple +from copy import deepcopy +from dataclasses import dataclass +from enum import Enum, auto +from typing import Set, Tuple, Dict, Union, List, Optional from engine.types import * -from engine.utils import enlist, base62uuid, base62alp, get_leagl_name +from engine.utils import enlist, base62uuid, base62alp, get_legal_name from reconstruct.storage import Context, TableInfo, ColRef class ast_node: @@ -9,11 +11,14 @@ class ast_node: types = dict() first_order = False - def __init__(self, parent:"ast_node", node, context:Context = None): + def __init__(self, parent:Optional["ast_node"], node, context:Optional[Context] = None): self.context = parent.context if context is None else context self.parent = parent self.sql = '' - self.datasource = None + if hasattr(parent, 'datasource'): + self.datasource = parent.datasource + else: + self.datasource = None self.init(node) self.produce(node) self.spawn(node) @@ -38,7 +43,7 @@ class ast_node: self.emit(self.sql+';\n') -from reconstruct.expr import expr +from reconstruct.expr import expr, fastscan class projection(ast_node): @@ -70,10 +75,6 @@ class projection(ast_node): else: self.where = None - if 'groupby' in node: - self.group_node = groupby(self, node['groupby']) - else: - self.group_node = None def consume(self, node): # deal with projections @@ -82,9 +83,9 @@ class projection(ast_node): col_ext : Set[ColRef]= set() col_exprs : List[Tuple[str, Types]] = [] - proj_map = dict() + proj_map : Dict[int, List[Union[Types, int, str, expr]]]= dict() var_table = dict() - + self.sp_refs = set() for i, proj in enumerate(self.projections): compound = False self.datasource.rec = set() @@ -102,25 +103,26 @@ class projection(ast_node): name = eval('f\'' + name + '\'') if name not in var_table: var_table[name] = len(col_exprs) - proj_map[i] = [this_type, len(col_exprs)] + proj_map[i] = [this_type, len(col_exprs), proj_expr] col_exprs.append((name, proj_expr.type)) else: self.context.headers.add('"./server/aggregations.h"') if self.datasource.rec is not None: - col_ext = col_ext.union(self.datasource.rec) - proj_map[i] = [this_type, proj_expr.sql] + col_ext = col_ext.union(self.datasource.rec) # TODO: make this one var? + self.sp_refs = self.sp_refs.union(self.datasource.rec) + proj_map[i] = [this_type, proj_expr.sql, proj_expr] if 'name' in proj: # renaming column by AS keyword name += ' AS ' + proj['name'] if not proj_expr.is_special: var_table[proj['name']] = len(col_exprs) - disp_name = get_leagl_name(name) + disp_name = get_legal_name(name) elif type(proj) is str: col = self.datasource.get_col(proj) this_type = col.type - name = col.name + # name = col.name self.datasource.rec = None # TODO: Type deduction in Python cols.append(ColRef(this_type, self.out_table, None, disp_name, i, compound=compound)) @@ -133,13 +135,17 @@ class projection(ast_node): if col not in var_table: var_table[col] = i + _base_offset + def finialize(astnode:ast_node): if(astnode is not None): self.add(astnode.sql) self.add('FROM') finialize(self.datasource) finialize(self.where) - finialize(self.group_node) + if 'groupby' in node: + self.group_node = groupby(self, node['groupby']) + else: + self.group_node = None if 'orderby' in node: self.add(orderby(self, node['orderby']).sql) if 'outfile' in node: @@ -149,6 +155,8 @@ class projection(ast_node): else: # TODO: subquery, name create tmp-table from subquery w/ alias as name pass + + # cpp module codegen self.context.has_dll = True # extract typed-columns from result-set @@ -159,44 +167,59 @@ class projection(ast_node): self.context.emitc(f'auto {length_name} = server->cnt;') for v, idx in var_table.items(): - vname = get_leagl_name(v) + '_' + base62uuid(3) + vname = get_legal_name(v) + '_' + base62uuid(3) pyname2cname[v] = vname self.context.emitc(f'auto {vname} = ColRef<{typenames[idx].cname}>({length_name}, server->getCol({idx}));') vid2cname[idx] = vname # Create table into context outtable_name = 'out_' + base62uuid(6) out_typenames = [None] * len(proj_map) + for key, val in proj_map.items(): if type(val[1]) is str: x = True y = lambda t: pyname2cname[t] - val[1] = eval('f\'' + val[1] + '\'') + val[1] = val[2].eval(x, y, gettype=True) + if callable(val[1]): + val[1] = val[1](True) + decltypestring = val[1] + if val[0] == LazyT: - out_typenames[key] = f'value_type>' + out_typenames[key] = f'value_type>' else: out_typenames[key] = val[0].cname # out_typenames = [v[0].cname for v in proj_map.values()] self.context.emitc(f'auto {outtable_name} = new TableInfo<{",".join(out_typenames)}>("{outtable_name}");') - - for key, val in proj_map.items(): - if type(val[1]) is int: - self.context.emitc(f'{outtable_name}->get_col<{key}>().initfrom({vid2cname[val[1]]});') - else: - # for funcs evaluate f_i(x, ...) - self.context.emitc(f'{outtable_name}->get_col<{key}>() = {val[1]};') + # TODO: Inject custom group by code here and flag them in proj_map + # Type of UDFs? Complex UDFs, ones with static vars? + if self.group_node is not None: + gb_vartable : Dict[str, Union[str, int]] = deepcopy(pyname2cname) + gb_cexprs : List[str] = [] + + for key, val in proj_map.items(): + col_name = 'col_' + base62uuid(6) + self.context.emitc(f'auto {col_name} = {outtable_name}->get_col<{key}>();') + gb_cexprs.append((col_name, val[2])) + self.group_node.finalize(gb_cexprs, gb_vartable) + else: + for key, val in proj_map.items(): + if type(val[1]) is int: + self.context.emitc(f'{outtable_name}->get_col<{key}>().initfrom({vid2cname[val[1]]});') + else: + # for funcs evaluate f_i(x, ...) + self.context.emitc(f'{outtable_name}->get_col<{key}>() = {val[1]};') # print out col_is self.context.emitc(f'print(*{outtable_name});') - + class orderby(ast_node): name = 'order by' def produce(self, node): if node is None: self.sql = '' return - elif type(node) is not list: - node = [node] + node = enlist(node) o_list = [] for o in node: @@ -206,11 +229,172 @@ class orderby(ast_node): o_list.append(o_str) self.add(', '.join(o_list)) + +class scan(ast_node): + name = 'scan' + def __init__(self, parent: "ast_node", node, loop_style = 'for', context: Context = None, const = False): + self.const = "const " if const else "" + self.loop_style = loop_style + super().__init__(parent, node, context) + + def init(self, _): + self.datasource = self.context.datasource + self.initializers = '' + self.start = '' + self.front = '' + self.body = '' + self.end = '}' + scan_vars = set(s.it_var for s in self.context.scans) + self.it_ver = 'i' + base62uuid(2) + while(self.it_ver in scan_vars): + self.it_ver = 'i' + base62uuid(6) + self.parent.context.scans.append(self) + + def produce(self, node): + if self.loop_style == 'for_each': + self.colref = node + self.start += f'for ({self.const}auto& {self.it_ver} : {node.cobj}) {{\n' + else: + self.start += f"for (uint32_t {self.it_ver} = 0; {self.it_ver} < {node}; ++{self.it_ver}){{\n" + + def add(self, stmt, position = "body"): + if position == "body": + self.body += stmt + '\n' + elif position == "init": + self.initializers += stmt + '\n' + else: + self.front += stmt + '\n' -class groupby(orderby): - name = 'group by' + def finalize(self): + self.context.remove_scan(self, self.initializers + self.start + self.front + self.body + self.end) + +class groupby_c(ast_node): + name = '_groupby' + def produce(self, node : List[Tuple[expr, Set[ColRef]]]): + self.context.headers.add('"./server/hasher.h"') + self.context.headers.add('unordered_map') + self.group = 'g' + base62uuid(7) + self.group_type = 'record_type' + base62uuid(7) + self.datasource = self.parent.datasource + self.scanner = None + self.datasource.rec = set() + + g_contents = '' + g_contents_list = [] + first_col = '' + + for g in node: + e = g[0] + g_str = e.eval(c_code = True) + # if v is compound expr, create tmp cols + if e.is_ColExpr: + tmpcol = 't' + base62uuid(7) + self.emit(f'auto {tmpcol} = {g_str};') + e = tmpcol + g_contents_list.append(e) + first_col = g_contents_list[0] + g_contents_decltype = [f'decays' for c in g_contents_list] + g_contents = ','.join(g_contents_list) + self.emit(f'typedef record<{",".join(g_contents_decltype)}> {self.group_type};') + self.emit(f'unordered_map<{self.group_type}, vector_type, ' + f'transTypes<{self.group_type}, hasher>> {self.group};') + self.n_grps = len(node) + self.scanner = scan(self, first_col + '.size') + self.scanner.add(f'{self.group}[forward_as_tuple({g_contents}[{self.scanner.it_ver}])].emplace_back({self.scanner.it_ver});') + def consume(self, _): + self.scanner.finalize() + + # def deal_with_assumptions(self, assumption:assumption, out:TableInfo): + # gscanner = scan(self, self.group) + # val_var = 'val_'+base62uuid(7) + # gscanner.add(f'auto &{val_var} = {gscanner.it_ver}.second;') + # gscanner.add(f'{self.datasource.cxt_name}->order_by<{assumption.result()}>(&{val_var});') + # gscanner.finalize() + + def finalize(self, cexprs : List[Tuple[str, expr]], var_table : Dict[str, Union[str, int]]): + gscanner = scan(self, self.group) + key_var = 'key_'+base62uuid(7) + val_var = 'val_'+base62uuid(7) + + gscanner.add(f'auto &{key_var} = {gscanner.it_ver}.first;') + gscanner.add(f'auto &{val_var} = {gscanner.it_ver}.second;') + len_var = None + def define_len_var(): + nonlocal len_var + if len_var is None: + len_var = 'len_'+base62uuid(7) + gscanner.add(f'auto &{len_var} = {val_var}.size;', position = 'front') + + def get_var_names (varname : str): + var = var_table[varname] + if type(var) is str: + return f'{var}[{val_var}]' + else: + return f'get<{var}>({key_var})' + + for ce in cexprs: + ex = ce[1] + materialize_builtin = {} + if type(ex.udf) is udf: + if '_builtin_len' in ex.udf.builtin_used: + define_len_var() + materialize_builtin['_builtin_len'] = len_var + if '_builtin_ret' in ex.udf.builtin_used: + define_len_var() + gscanner.add(f'{ce[0]}.emplace_back({{{len_var}}});\n') + materialize_builtin['_builtin_ret'] = f'{ce[0]}.back()' + gscanner.add(f'{ex.eval(c_code = True, y=get_var_names, materialize_builtin = materialize_builtin)};\n') + continue + gscanner.add(f'{ce[0]}.emplace_back({ex.eval(c_code = True, y=get_var_names, materialize_builtin = materialize_builtin)});\n') + + gscanner.finalize() + + self.datasource.groupinfo = None + + +class groupby(ast_node): + name = 'group by' + @property + def use_sp_gb (self): + return len(self.sp_refs) > 0 + def produce(self, node): + if type(self.parent) is not projection: + raise ValueError('groupby can only be used in projection') + sp_refs = self.parent.sp_refs + + node = enlist(node) + o_list = [] + self.dedicated_glist = [] + self.refs : Set[ColRef] = set() + self.sp_refs : Set[ColRef] = set() + for g in node: + self.datasource.rec = set() + g_expr = expr(self, g['value']) + refs : Set[ColRef] = self.datasource.rec + self.datasource.rec = None + this_sp_ref = refs.difference(sp_refs) + this_ref = refs.intersection(this_sp_ref) + # TODO: simplify this + self.refs = self.refs.union(this_ref) + self.sp_refs = self.sp_refs.union(this_sp_ref) + + self.dedicated_glist.append((g_expr, refs)) + g_str = g_expr.eval(c_code = False) + if 'sort' in g and f'{g["sort"]}'.lower() == 'desc': + g_str = g_str + ' ' + 'DESC' + o_list.append(g_str) + + if not self.use_sp_gb: + self.dedicated_gb = None + self.add(', '.join(o_list)) + + def finalize(self, cexprs : List[Tuple[str, expr]], var_table : Dict[str, Union[str, int]]): + if self.use_sp_gb: + self.dedicated_gb = groupby_c(self.parent, self.dedicated_glist) + self.dedicated_gb.finalize(cexprs, var_table) + class join(ast_node): name = 'join' def init(self, _): @@ -233,7 +417,7 @@ class join(ast_node): self.tables_dir[tbls.table_name] = tbls for a in tbls.alias: self.tables_dir[a] = tbls - + elif type(tbls) is projection: self.joins.append(alias(tbls.finalize())) @@ -257,7 +441,6 @@ class join(ast_node): tbl = self.context.tables_byname[table_name] if 'name' in node: tbl.add_alias(node['name']) - self.append(tbl, alias) else: keys = node.keys() @@ -271,7 +454,10 @@ class join(ast_node): self.tables_dir = {**self.tables_dir, **j.tables_dir} elif type(node) is str: - self.append(self.context.tables_byname[node]) + if node in self.context.tables_byname: + self.append(self.context.tables_byname[node]) + else: + print(f'Error: table {node} not found.') def get_cols(self, colExpr: str) -> ColRef: for t in self.tables: @@ -324,9 +510,7 @@ class create_table(ast_node): self.sql += ')' if self.context.use_columnstore: self.sql += ' engine=ColumnStore' - - class insert(ast_node): name = 'insert' first_order = name @@ -405,56 +589,261 @@ class outfile(ast_node): class udf(ast_node): name = 'udf' first_order = name + @dataclass + class builtin_var: + enabled : bool = False + _type : Types = AnyT + all = ('_builtin_len', '_builtin_ret') + + def decltypecall(self, c_code = False, *args): + from engine.types import fn_behavior + class dummy: + def __init__(self, name): + self.cname = name + '_gettype' + self.sqlname = self.cname + return fn_behavior(dummy(self.cname), c_code, *args) + def __call__(self, c_code = False, *args): from engine.types import fn_behavior - return fn_behavior(self, c_code, *args) + builtin_args = [f'{{{n}()}}' for n, v in self.builtin.items() if v.enabled] + return fn_behavior(self, c_code, *args, *builtin_args) + def return_type(self, *_ : Types): return LazyT - def init(self, node): + + def init(self, _): + self.builtin : Dict[str, udf.builtin_var] = { + '_builtin_len' : udf.builtin_var(False, UIntT), + '_builtin_ret' : udf.builtin_var(False, Types( + 255, name = 'generic_ref', cname = 'auto&' + )) + } self.var_table = {} self.args = [] if self.context.udf is None: self.context.udf = Context.udf_head self.context.headers.add('\"./udf.hpp\"') - + self.vecs = set() + self.code_list = [] + self.builtin_used = None + + def add(self, *code): + ccode = '' + for c in code: + if type(c) is str: + ccode += c + else: + self.code_list.append(ccode) + self.code_list.append(c) + ccode = '' + if ccode: + self.code_list.append(ccode) + + def produce(self, node): - from engine.utils import get_leagl_name, check_leagl_name + from engine.utils import get_legal_name, check_legal_name node = node[self.name] # register udf - self.cname = get_leagl_name(node['fname']) + self.agg = 'Agg' in node + self.cname = get_legal_name(node['fname']) self.sqlname = self.cname self.context.udf_map[self.cname] = self - self.ccode = f'auto {self.cname} = [](' - + if self.agg: + self.context.udf_agg_map[self.cname] = self + self.add(f'auto {self.cname} = [](') + + def get_block(self, ind, node): + if 'stmt' in node: + old_ind = ind + ind += '\t' + next_stmt = enlist(node['stmt']) + if len(next_stmt) > 1: + self.add(f' {{\n') + self.get_stmt(ind ,next_stmt) + self.add(f'{old_ind}}}\n') + else: + self.get_stmt(ind, next_stmt) + + def get_cname(self, x:str): + return self.var_table[x] + + def get_assignment(self, ind, node, *, types = 'auto', sep = ';\n'): + var_ex = expr(self, node['var'], c_code=True, supress_undefined = True) + ex = expr(self, node['expr'], c_code=True) + var = var_ex.eval(y=self.get_cname) + if var in self.var_table or hasattr(var_ex, 'builtin_var'): + op = '=' + if 'op' in node and node['op'] != ':=': + op = node['op'] + e = ex.eval(y=self.get_cname) + def assign_behavior(decltypestr = False): + nonlocal ind, var, op, e, sep + v = var(decltypestr) if callable(var) else var + _e = e(decltypestr) if callable(e) else e + if v == '_builtin_ret': + return f'{ind}return {_e}{sep}' + elif '_builtin_ret' not in _e: + return f'{ind}{v} {op} {_e}{sep}' + else: + return '' + self.add(assign_behavior) + else: + cvar = get_legal_name(var) + self.var_table[var] = cvar + self.add(f'{ind}{types} {cvar} = ', ex.eval(y=self.get_cname), sep) + + def get_stmt(self, ind, node): + node = enlist(node) + for n in node: + if 'if' in n: + _ifnode = n['if'] + self.add(f'{ind}if(', expr(self, _ifnode["cond"]).eval(y=self.get_cname), ')') + if 'stmt' in _ifnode: + self.get_block(ind, _ifnode) + else: + self.add('\n') + self.get_stmt(ind + '\t', _ifnode) + if 'elif' in _ifnode: + for e in n['elif']: + self.add(f'{ind}else if(', expr(self, e["cond"]).eval(y=self.get_cname), ')') + self.get_block(ind, e) + if 'else' in _ifnode: + self.add(f'{ind}else ') + self.get_block(ind, _ifnode['else']) + + elif 'for' in n: + _fornode = n['for'] + defs = _fornode['defs'] + self.add(f'{ind}for({"auto " if len(enlist(defs["op"])) != 0 else ";"}') + def get_inline_assignments(node, end = '; '): + var = enlist(node['var']) + op = enlist(node['op']) + expr = enlist(node['expr']) + len_node = len(enlist(op)) + for i, (v, o, e) in enumerate(zip(var, op, expr)): + self.get_assignment('', {'var' : v, 'op' : o, 'expr' : e}, types = '', sep = ', ' if i != len_node - 1 else end) + get_inline_assignments(defs) + self.add(expr(self, _fornode["cond"]).eval(y=self.get_cname), '; ') + get_inline_assignments(_fornode['tail'], ') ') + if 'stmt' in _fornode: + self.get_block(ind, _fornode) + else: + self.add('\n') + self.get_stmt(ind + '\t', _fornode) + elif 'assignment' in n: + assign = n['assignment'] + self.get_assignment(ind, assign) + + def consume(self, node): - from engine.utils import get_leagl_name, check_leagl_name + from engine.utils import get_legal_name, check_legal_name node = node[self.name] - + if 'params' in node: for args in node['params']: - cname = get_leagl_name(args) + cname = get_legal_name(args) self.var_table[args] = cname self.args.append(cname) - self.ccode += ', '.join([f'auto {a}' for a in self.args]) + ') {\n' - - if 'assignment' in node: - for assign in node['assignment']: - var = assign['var'] - ex = expr(self, assign['expr'], c_code=True) - if var in self.var_table: - self.ccode += f'\t{var} = {ex.eval()};\n' - else: - cvar = get_leagl_name(var) - self.var_table[var] = cvar - self.ccode += f'\tauto {cvar} = {ex.eval()};\n' - + front = [*self.code_list, ', '.join([f'auto {a}' for a in self.args])] + self.code_list = [] + + self.with_storage = False + self.with_statics = False + self.static_decl : Optional[List[str]] = None + ind = '\t' + if 'static_decl' in node: + self.add(') {\n') + curr = node['static_decl'] + self.with_statics = True + if 'var' in curr and 'expr' in curr: + if len(curr['var']) != len(curr['expr']): + print("Error: every static variable must be initialized.") + self.static_decl = [] + for v, e in zip(curr['var'], curr['expr']): + cname = get_legal_name(v) + self.var_table[v] = cname + self.static_decl.append(f'{cname} = ', expr(self, e, c_code=True).eval(self.get_cname)) + self.add(f'{ind}static auto {"; static auto ".join(self.static_decl)};\n') + self.add(f'{ind}auto reset = [=]() {{ {"; ".join(self.static_decl)}; }};\n') + self.add(f'{ind}auto call = []({", ".join([f"decltype({a}) {a}" for a in self.args])}') + ind = '\t\t' + front = [*front, *self.code_list] + self.code_list = [] + if 'stmt' in node: + self.get_stmt(ind, node['stmt']) + # first scan to determine vec types + # if self.agg: + # for assign in node['assignment']: + # var = fastscan(assign['var']) + # ex = fastscan(assign['expr']) + # self.vecs.union(var.vec_vars) + # self.vecs.union(var.requested_lens) + # self.vecs.union(ex.vec_vars) + # self.vecs.union(ex.requested_lens) + # if len(self.vecs) != 0: + # self.idx_var = 'idx_' + base62uuid(5) + # self.ccode += f'{ind}auto {self.idx_var} = 0;\n' + ret = node['ret'] - self.ccode += f'\treturn {expr(self, ret, c_code=True).eval()};' - self.ccode += '\n};\n' - print(self.ccode) + def return_call(decltypestr = False): + if (decltypestr): + return '' + ret = '' + for r in self.return_call: + if callable(r): + ret += r(False) + else: + ret += r + return ret + self.return_call = (f'{ind}return ', expr(self, ret, c_code=True).eval(self.get_cname), ';\n') + self.add(return_call) + if self.with_statics: + self.add('\t};\n') + self.add('\treturn std::make_pair(reset, call);\n') + self.add('};\n') - self.context.udf += self.ccode + '\n' - + #print(self.ccode) + self.builtin_args = [(name, var._type.cname) for name, var in self.builtin.items() if var.enabled] + # self.context.udf += front + builtin_argstr + self.ccode + '\n' + self.finalize(front) + + def finalize(self, front): + builtin_argstr = ', ' if len(self.builtin_args) and len(self.args) else '' + builtin_argstr += ', '.join([f'{t} {n}' for (n, t) in self.builtin_args]) + self.builtin_used = [b for b, v in self.builtin.items() if v.enabled] + ccode = '' + def process_recursion(l, decltypestr = False): + nonlocal ccode + for c in l: + if type(c) is str: + ccode += c + elif callable(c): + ccode += c(decltypestr) # a callback function + else: + raise ValueError(f'Illegal operation in udf code generation: {c}') + process_recursion(front) + ccode += builtin_argstr + ') {\n' + process_recursion(self.code_list) + self.context.udf += ccode + '\n' + ccode = '' + if self.return_pattern == udf.ReturnPattern.elemental_return: + ccode += f'auto {self.cname}_gettype = [](' + process_recursion(front[1:], True) + ccode += ') {\n\tuint32_t _builtin_len = 0;\n' + process_recursion(self.code_list, True) + self.context.udf += ccode + '\n' + + class ReturnPattern(Enum): + bulk_return = auto() + elemental_return = auto() + + @property + def return_pattern(self): + if '_builtin_ret' in self.builtin_used: + return udf.ReturnPattern.elemental_return + else: + return udf.ReturnPattern.bulk_return + def include(objs): import inspect for _, cls in inspect.getmembers(objs): diff --git a/reconstruct/expr.py b/reconstruct/expr.py index 3250a79..acf8e9f 100644 --- a/reconstruct/expr.py +++ b/reconstruct/expr.py @@ -1,26 +1,59 @@ +from typing import Optional from reconstruct.ast import ast_node -from reconstruct.storage import ColRef +from reconstruct.storage import ColRef, Context from engine.types import * +# TODO: Decouple expr and upgrade architecture +# C_CODE : get ccode/sql code? +# projections : C/SQL/decltype string +# orderby/joins/where : SQL only +# assumption/groupby : C/sql +# is_udfexpr: C only + class expr(ast_node): name='expr' - - def __init__(self, parent, node, *, c_code = None): - from reconstruct.ast import projection + @property + def udf_decltypecall(self): + return self._udf_decltypecall if self._udf_decltypecall else self.sql + + @udf_decltypecall.setter + def udf_decltypecall(self, val): + self._udf_decltypecall = val + + @property + def need_decltypestr(self): + return self._udf_decltypecall is not None + + def __init__(self, parent, node, *, c_code = None, supress_undefined = False): + from reconstruct.ast import projection, udf self.type = None self.raw_col = None + self.udf : Optional[udf] = None self.inside_agg = False self.is_special = False + self.is_ColExpr = False + self.is_recursive_call_inudf = False + self.codlets : list = [] + self.codebuf : Optional[str] = None + self._udf_decltypecall = None + + self.supress_undefined = supress_undefined if(type(parent) is expr): self.inside_agg = parent.inside_agg - if(type(parent) is not expr): - self.root = self - self.c_code = type(parent) is projection - else: - self.root = parent.root + self.is_udfexpr = parent.is_udfexpr + self.root : expr = parent.root self.c_code = parent.c_code - + self.builtin_vars = parent.builtin_vars + else: + self.is_udfexpr = type(parent) is udf + self.root : expr = self + self.c_code = self.is_udfexpr or type(parent) is projection + if self.is_udfexpr: + self.udf : udf = parent + self.builtin_vars = self.udf.builtin.keys() + else: + self.builtin_vars = [] if type(c_code) is bool: self.c_code = c_code @@ -38,8 +71,11 @@ class expr(ast_node): self.udf_map = parent.context.udf_map self.func_maps = {**builtin_func, **self.udf_map} self.operators = {**builtin_operators, **self.udf_map} + def produce(self, node): from engine.utils import enlist + from reconstruct.ast import udf + if type(node) is dict: for key, val in node.items(): if key in self.operators: @@ -49,35 +85,114 @@ class expr(ast_node): exp_vals = [expr(self, v, c_code = self.c_code) for v in val] str_vals = [e.sql for e in exp_vals] type_vals = [e.type for e in exp_vals] - - self.type = op.return_type(*type_vals) + try: + self.type = op.return_type(*type_vals) + except AttributeError as e: + if type(self.root) is not udf: + print(f'alert: {e}') + self.type = AnyT + self.sql = op(self.c_code, *str_vals) special_func = [*self.context.udf_map.keys(), "maxs", "mins", "avgs", "sums"] if key in special_func and not self.is_special: self.is_special = True + if key in self.context.udf_map: + self.root.udf = self.context.udf_map[key] + if key == self.root.udf.name: + self.root.is_recursive_call_inudf = True p = self.parent while type(p) is expr and not p.is_special: p.is_special = True p = p.parent + + need_decltypestr = any([e.need_decltypestr for e in exp_vals]) + if need_decltypestr or (self.udf and type(op) is udf): + decltypestr_vals = [e.udf_decltypecall for e in exp_vals] + self.udf_decltypecall = op(self.c_code, *decltypestr_vals) + + if self.udf and type(op) is udf: + self.udf_decltypecall = op.decltypecall(self.c_code, *decltypestr_vals) + + elif self.is_udfexpr: + var_table = self.root.udf.var_table + vec = key.split('.') + _vars = [*var_table, *self.builtin_vars] + def get_vname (node): + if node in self.builtin_vars: + self.root.udf.builtin[node].enabled = True + self.builtin_var = node + return node + else: + return var_table[node] + if vec[0] not in _vars: + print(f'Use of undefined variable {vec[0]}') + else: + vname = get_vname(vec[0]) + val = enlist(val) + if(len(val) > 2): + print('Warning: more than 2 indexes found for subvec operator.') + ex = [expr(self, v, c_code = self.c_code) for v in val] + idxs = ', '.join([e.sql for e in ex]) + self.sql = f'{vname}.subvec({idxs})' + if any([e.need_decltypestr for e in ex]): + self.udf_decltypecall = f'{vname}.subvec({[", ".join([e.udf_decltypecall for e in ex])]})' + if key == 'get' and len(val) > 1: + ex_vname = expr(self, val[0], c_code=self.c_code) + self.sql = f'{ex_vname.sql}[{expr(self, val[1], c_code=self.c_code).sql}]' + if hasattr(ex_vname, 'builtin_var'): + if not hasattr(self, 'builtin_var'): + self.builtin_var = [] + self.builtin_var = [*self.builtin_var, *ex_vname.builtin_var] + self.udf_decltypecall = ex_vname.sql else: print(f'Undefined expr: {key}{val}') elif type(node) is str: - p = self.parent - while type(p) is expr and not p.isvector: - p.isvector = True - p = p.parent - if self.datasource is not None: - self.raw_col = self.datasource.parse_col_names(node) - self.raw_col = self.raw_col if type(self.raw_col) is ColRef else None - if self.raw_col is not None: - self.sql = self.raw_col.name - self.type = self.raw_col.type + if self.is_udfexpr: + curr_udf : udf = self.root.udf + var_table = curr_udf.var_table + split = node.split('.') + if split[0] in var_table: + varname = var_table[split[0]] + if curr_udf.agg and varname in curr_udf.vecs: + if len(split) > 1: + if split[1] == 'vec': + self.sql += varname + elif split[1] == 'len': + self.sql += f'{varname}.size' + else: + print(f'no member {split[1]} in object {varname}') + else: + self.sql += f'{varname}[{curr_udf.idx_var}]' + else: + self.sql += varname + elif self.supress_undefined or split[0] in self.builtin_vars: + self.sql += node + if split[0] in self.builtin_vars: + curr_udf.builtin[split[0]].enabled = True + self.builtin_var = split[0] + else: + print(f'Undefined varname: {split[0]}') + + + # get the column from the datasource in SQL context else: - self.sql = node - self.type = StrT - if self.c_code and self.datasource is not None: - self.sql = f'{{y(\"{self.sql}\")}}' + p = self.parent + while type(p) is expr and not p.isvector: + p.isvector = True + p = p.parent + if self.datasource is not None: + self.raw_col = self.datasource.parse_col_names(node) + self.raw_col = self.raw_col if type(self.raw_col) is ColRef else None + if self.raw_col is not None: + self.is_ColExpr = True + self.sql = self.raw_col.name + self.type = self.raw_col.type + else: + self.sql = node + self.type = StrT + if self.c_code and self.datasource is not None: + self.sql = f'{{y(\"{self.sql}\")}}' elif type(node) is bool: self.type = IntT if self.c_code: @@ -91,18 +206,109 @@ class expr(ast_node): elif type(node) is float: self.type = DoubleT - def finalize(self, y): - if self.c_code: - x = self.is_special - self.sql = eval('f\'' + self.sql + '\'') - + def finalize(self, override = False): + from reconstruct.ast import udf + if self.codebuf is None or override: + self.codebuf = '' + for c in self.codlets: + if type(c) is str: + self.codebuf += c + elif type(c) is udf: + self.codebuf += c() + elif type(c) is expr: + self.codebuf += c.finalize(override=override) + return self.codebuf + def __str__(self): return self.sql def __repr__(self): return self.__str__() - def eval(self): - x = self.c_code - y = lambda x: x - return eval('f\'' + self.sql + '\'') + + # builtins is readonly, so it's okay to set default value as an object + # eval is only called at root expr. + def eval(self, c_code = None, y = lambda t: t, materialize_builtin = False, _decltypestr = False, *, gettype = False): + assert(self.is_root) + def call(decltypestr = False) -> str: + nonlocal c_code, y, materialize_builtin + if self.udf is not None: + loc = locals() + builtin_vars = self.udf.builtin_used + for b in self.udf.builtin_var.all: + exec(f'loc["{b}"] = lambda: "{{{b}()}}"') + if builtin_vars: + if type(materialize_builtin) is dict: + for b in builtin_vars: + exec(f'loc["{b}"] = lambda: "{materialize_builtin[b]}"') + elif self.is_recursive_call_inudf: + for b in builtin_vars: + exec(f'loc["{b}"] = lambda : "{b}"') + + x = self.c_code if c_code is None else c_code + if decltypestr: + return eval('f\'' + self.udf_decltypecall + '\'') + return eval('f\'' + self.sql + '\'') + if self.is_recursive_call_inudf or (self.need_decltypestr and self.is_udfexpr) or gettype: + return call + else: + return call(_decltypestr) + + @property + def is_root(self): + return self.root == self + + +# For UDFs: first check if agg variable is used as vector +# if not, then check if its length is used +class fastscan(expr): + name = 'fastscan' + + def init(self, _): + self.vec_vars = set() + self.requested_lens = set() + super().init(self, _) + + def process(self, key : str): + segs = key.split('.') + var_table = self.root.udf.var_table + if segs[0] in var_table and len(segs) > 1: + if segs[1] == 'vec': + self.vec_vars.add(segs[0]) + elif segs[1] == 'len': + self.requested_lens.add(segs[0]) + + def produce(self, node): + from engine.utils import enlist + if type(node) is dict: + for key, val in node.items(): + if key in self.operators: + val = enlist(val) + elif self.is_udfexpr: + self.process(key) + [fastscan(self, v, c_code = self.c_code) for v in val] + + elif type(node) is str: + self.process(node) -import engine.expr as cexpr + +class getrefs(expr): + name = 'getrefs' + + def init(self, _): + self.datasource.rec = set() + self.rec = None + + def produce(self, node): + from engine.utils import enlist + if type(node) is dict: + for key, val in node.items(): + if key in self.operators: + val = enlist(val) + [getrefs(self, v, c_code = self.c_code) for v in val] + + elif type(node) is str: + self.datasource.parse_col_names(node) + + def consume(self, _): + if self.root == self: + self.rec = self.datasource.rec + self.datasource.rec = None \ No newline at end of file diff --git a/reconstruct/storage.py b/reconstruct/storage.py index 7108d52..0d47b37 100644 --- a/reconstruct/storage.py +++ b/reconstruct/storage.py @@ -86,6 +86,7 @@ class Context: self.sql = '' self.finalized = False self.udf = None + self.scans = [] def __init__(self): self.tables_byname = dict() @@ -94,6 +95,7 @@ class Context: self.cols = [] self.datasource = None self.udf_map = dict() + self.udf_agg_map = dict() self.use_columnstore = False self.print = print self.has_dll = False @@ -110,7 +112,10 @@ class Context: tbl = TableInfo(table_name, cols, self) self.tables.append(tbl) return tbl - + def remove_scan(self, scan, str_scan): + self.emitc(str_scan) + self.scans.remove(scan) + function_head = ''' extern "C" int __DLLEXPORT__ dllmain(Context* cxt) { using namespace std; diff --git a/requirements.txt b/requirements.txt index 52da39d..356f166 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ mo-future mo-dots==8.20.21357 mo-parsing mo-imports -readline; sys_platform != 'win32' \ No newline at end of file +readline; sys_platform != 'win32' +numpy diff --git a/sdk/aquery.h b/sdk/aquery.h new file mode 100644 index 0000000..40865e2 --- /dev/null +++ b/sdk/aquery.h @@ -0,0 +1,12 @@ +#include "../server/libaquery.h" + + +extern void* Aalloc(size_t sz); +extern int Afree(void * mem); + +template +size_t register_memory(T* ptr){ + [](void* m){ auto _m = static_cast(m); delete _m; }; +} + +#define EXPORT __DLLEXPORT__ \ No newline at end of file diff --git a/sdk/aquery_mem.cpp b/sdk/aquery_mem.cpp new file mode 100644 index 0000000..fd37545 --- /dev/null +++ b/sdk/aquery_mem.cpp @@ -0,0 +1,5 @@ +#include "aquery.h" + +#include +#include + diff --git a/server/Release/monetdb_conn.obj b/server/Release/monetdb_conn.obj deleted file mode 100644 index 88764c1..0000000 Binary files a/server/Release/monetdb_conn.obj and /dev/null differ diff --git a/server/Release/server.exp b/server/Release/server.exp deleted file mode 100644 index fb760a9..0000000 Binary files a/server/Release/server.exp and /dev/null differ diff --git a/server/Release/server.lib b/server/Release/server.lib deleted file mode 100644 index 1ec341e..0000000 Binary files a/server/Release/server.lib and /dev/null differ diff --git a/server/Release/server.obj b/server/Release/server.obj deleted file mode 100644 index 0a7646f..0000000 Binary files a/server/Release/server.obj and /dev/null differ diff --git a/server/Release/server.tlog/CL.17908.write.1.tlog b/server/Release/server.tlog/CL.17908.write.1.tlog deleted file mode 100644 index 41f2cd1..0000000 Binary files a/server/Release/server.tlog/CL.17908.write.1.tlog and /dev/null differ diff --git a/server/Release/server.tlog/CL.command.1.tlog b/server/Release/server.tlog/CL.command.1.tlog deleted file mode 100644 index b23beed..0000000 Binary files a/server/Release/server.tlog/CL.command.1.tlog and /dev/null differ diff --git a/server/Release/server.tlog/CL.read.1.tlog b/server/Release/server.tlog/CL.read.1.tlog deleted file mode 100644 index 93532e6..0000000 Binary files a/server/Release/server.tlog/CL.read.1.tlog and /dev/null differ diff --git a/server/Release/server.tlog/link.command.1.tlog b/server/Release/server.tlog/link.command.1.tlog deleted file mode 100644 index 46b134b..0000000 --- a/server/Release/server.tlog/link.command.1.tlog +++ /dev/null @@ -1 +0,0 @@ -ÿþ \ No newline at end of file diff --git a/server/Release/server.tlog/link.read.1.tlog b/server/Release/server.tlog/link.read.1.tlog deleted file mode 100644 index 46b134b..0000000 --- a/server/Release/server.tlog/link.read.1.tlog +++ /dev/null @@ -1 +0,0 @@ -ÿþ \ No newline at end of file diff --git a/server/Release/server.tlog/link.write.1.tlog b/server/Release/server.tlog/link.write.1.tlog deleted file mode 100644 index 46b134b..0000000 --- a/server/Release/server.tlog/link.write.1.tlog +++ /dev/null @@ -1 +0,0 @@ -ÿþ \ No newline at end of file diff --git a/server/Release/server.tlog/server.lastbuildstate b/server/Release/server.tlog/server.lastbuildstate deleted file mode 100644 index 9021fae..0000000 --- a/server/Release/server.tlog/server.lastbuildstate +++ /dev/null @@ -1,2 +0,0 @@ -#TargetFrameworkVersion=:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.19041.0 -Release|Win32|d:\gg\AQuery++\server\| diff --git a/server/Release/server.tlog/unsuccessfulbuild b/server/Release/server.tlog/unsuccessfulbuild deleted file mode 100644 index e69de29..0000000 diff --git a/server/Release/table.obj b/server/Release/table.obj deleted file mode 100644 index abdcac0..0000000 Binary files a/server/Release/table.obj and /dev/null differ diff --git a/server/Release/types.obj b/server/Release/types.obj deleted file mode 100644 index 7e8ec8a..0000000 Binary files a/server/Release/types.obj and /dev/null differ diff --git a/server/Release/utils.obj b/server/Release/utils.obj deleted file mode 100644 index 1b647e6..0000000 Binary files a/server/Release/utils.obj and /dev/null differ diff --git a/server/Release/vc141.pdb b/server/Release/vc141.pdb deleted file mode 100644 index 28b5bcf..0000000 Binary files a/server/Release/vc141.pdb and /dev/null differ diff --git a/server/Release/vector_type.obj b/server/Release/vector_type.obj deleted file mode 100644 index 827cbe8..0000000 Binary files a/server/Release/vector_type.obj and /dev/null differ diff --git a/server/Release/winhelper.obj b/server/Release/winhelper.obj deleted file mode 100644 index cb24bb0..0000000 Binary files a/server/Release/winhelper.obj and /dev/null differ diff --git a/server/monetdb_conn.cpp b/server/monetdb_conn.cpp index d42cafc..be0f043 100644 --- a/server/monetdb_conn.cpp +++ b/server/monetdb_conn.cpp @@ -14,11 +14,26 @@ const char* monetdbe_type_str[] = { // should be last: "monetdbe_type_unknown" } ; +const unsigned char monetdbe_type_szs[] = { + sizeof(monetdbe_column_bool::null_value), sizeof(monetdbe_column_int8_t::null_value), + sizeof(monetdbe_column_int16_t::null_value), sizeof(monetdbe_column_int32_t::null_value), + sizeof(monetdbe_column_int64_t::null_value), +#ifdef HAVE_HGE + sizeof(monetdbe_column_int128_t::null_value), +#endif + sizeof(monetdbe_column_size_t::null_value), sizeof(monetdbe_column_float::null_value), + sizeof(monetdbe_column_double::null_value), + sizeof(monetdbe_column_str::null_value), sizeof(monetdbe_column_blob::null_value), + sizeof(monetdbe_data_date), sizeof(monetdbe_data_time), sizeof(monetdbe_data_timestamp), + // should be last: + 1 +}; Server::Server(Context* cxt){ if (cxt){ connect(cxt); - } + } + } void Server::connect(Context *cxt){ diff --git a/server/monetdb_conn.h b/server/monetdb_conn.h index f8cbcad..bfc0ead 100644 --- a/server/monetdb_conn.h +++ b/server/monetdb_conn.h @@ -1,4 +1,8 @@ -#include "monetdbe.h" +#ifdef _WIN32 + #include "monetdbe.h" +#else + #include "monetdb/monetdbe.h" +#endif struct Context; diff --git a/server/server.cpp b/server/server.cpp index 24b8eed..9d49d14 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -111,49 +111,50 @@ int dll_main(int argc, char** argv, Context* cxt){ return 0; } - -extern "C" int __DLLEXPORT__ main(int argc, char** argv) { - puts("running"); - Context* cxt = new Context(); - cxt->log("%d %s\n", argc, argv[1]); - - const char* shmname; - if (argc < 0) - return dll_main(argc, argv, cxt); - else if (argc <= 1) - return test_main(); - else - shmname = argv[1]; - SharedMemory shm = SharedMemory(shmname); - if (!shm.pData) - return 1; - bool &running = static_cast(shm.pData)[0], - &ready = static_cast(shm.pData)[1]; - using namespace std::chrono_literals; - cxt->log("running: %s\n", running? "true":"false"); - cxt->log("ready: %s\n", ready? "true":"false"); - while (running) { - std::this_thread::sleep_for(1ms); - if(ready){ - cxt->log("running: %s\n", running? "true":"false"); - cxt->log("ready: %s\n", ready? "true":"false"); - void* handle = dlopen("./dll.so", RTLD_LAZY); - cxt->log("handle: %lx\n", handle); - if (handle) { - cxt->log("inner\n"); - code_snippet c = reinterpret_cast(dlsym(handle, "dllmain")); - cxt->log("routine: %lx\n", c); - if (c) { - cxt->log("inner\n"); - cxt->err("return: %d\n", c(cxt)); - } - } - ready = false; - } - } - shm.FreeMemoryMap(); - return 0; -} +// +//extern "C" int __DLLEXPORT__ main(int argc, char** argv) { +// +// puts("running"); +// Context* cxt = new Context(); +// cxt->log("%d %s\n", argc, argv[1]); +// +// const char* shmname; +// if (argc < 0) +// return dll_main(argc, argv, cxt); +// else if (argc <= 1) +// return test_main(); +// else +// shmname = argv[1]; +// SharedMemory shm = SharedMemory(shmname); +// if (!shm.pData) +// return 1; +// bool &running = static_cast(shm.pData)[0], +// &ready = static_cast(shm.pData)[1]; +// using namespace std::chrono_literals; +// cxt->log("running: %s\n", running? "true":"false"); +// cxt->log("ready: %s\n", ready? "true":"false"); +// while (running) { +// std::this_thread::sleep_for(1ms); +// if(ready){ +// cxt->log("running: %s\n", running? "true":"false"); +// cxt->log("ready: %s\n", ready? "true":"false"); +// void* handle = dlopen("./dll.so", RTLD_LAZY); +// cxt->log("handle: %lx\n", handle); +// if (handle) { +// cxt->log("inner\n"); +// code_snippet c = reinterpret_cast(dlsym(handle, "dllmain")); +// cxt->log("routine: %lx\n", c); +// if (c) { +// cxt->log("inner\n"); +// cxt->err("return: %d\n", c(cxt)); +// } +// } +// ready = false; +// } +// } +// shm.FreeMemoryMap(); +// return 0; +//} #include "utils.h" int test_main() { diff --git a/server/table.h b/server/table.h index e85aa1e..cb80da3 100644 --- a/server/table.h +++ b/server/table.h @@ -62,6 +62,9 @@ public: ColRef(const char* name, types::Type_t ty) : name(name), ty(ty) {} using vector_type<_Ty>::operator[]; using vector_type<_Ty>::operator=; + using vector_type<_Ty>::subvec; + using vector_type<_Ty>::subvec_view; + using vector_type<_Ty>::subvec_deep; ColView<_Ty> operator [](const vector_type&idxs) const { return ColView<_Ty>(*this, idxs); } @@ -132,6 +135,14 @@ public: ret[i] = orig[idxs[i]]; return ret; } + ColRef<_Ty> subvec_deep(uint32_t start, uint32_t end) { + uint32_t len = end - start; + ColRef<_Ty> subvec(len); + for (uint32_t i = 0; i < len; ++i) + subvec[i] = operator[](i); + return subvec; + } + inline ColRef<_Ty> subvec_deep(uint32_t start = 0) { return subvec_deep(start, size); } }; template