From b6e71dbf0d77ddacfca8a48ad424120cbe161772 Mon Sep 17 00:00:00 2001 From: TotaJ Date: Tue, 7 Jul 2020 16:20:55 +0800 Subject: [PATCH] For mysql_fdw. --- GNUmakefile.in | 12 +- README.md | 1 + configure | 24 + contrib/mysql_fdw/Makefile | 54 ++ src/Makefile | 3 +- src/Makefile.global.in | 1 + src/common/backend/parser/analyze.cpp | 2 +- src/gausskernel/Makefile | 4 + .../optimizer/commands/extension.cpp | 12 +- .../optimizer/commands/functioncmds.cpp | 18 - src/gausskernel/optimizer/plan/createplan.cpp | 2 +- src/gausskernel/process/tcop/utility.cpp | 49 +- src/include/Makefile | 22 +- src/include/foreign/foreign.h | 3 + src/include/postgres.h | 4 + src/test/regress/expected/create_view1.out | 9 +- src/test/regress/expected/hw_sql_llt.out | 4 +- .../regress/output/create_basetype.source | 82 +- .../regress/output/create_c_function.source | 145 ++-- .../regress/output/create_function_1.source | 19 +- src/test/regress/output/misc.source | 83 +- .../single_node_create_function_1.source | 18 +- .../output/single_node_forbidden.source | 1 - src/test/regress/output/temp__3.source | 4 +- src/test/regress/output/temp__4.source | 6 +- src/test/regress/output/udf_crem.source | 72 -- .../huawei_mysql_fdw-2.5.3_patch.patch | 743 ++++++++++++++++++ .../mysql_fdw/mysql_fdw-REL-2_5_3.tar.gz | Bin 0 -> 42804 bytes 28 files changed, 1048 insertions(+), 349 deletions(-) create mode 100644 contrib/mysql_fdw/Makefile create mode 100644 third_party/dependency/mysql_fdw/huawei_mysql_fdw-2.5.3_patch.patch create mode 100644 third_party/dependency/mysql_fdw/mysql_fdw-REL-2_5_3.tar.gz diff --git a/GNUmakefile.in b/GNUmakefile.in index c9039bbf9e..d37de48367 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -26,8 +26,16 @@ world-contrib-recurse: world-src-recurse html man: $(MAKE) -C doc $@ + +ifeq ($(enable_mysql_fdw), yes) +install_mysql_fdw: + $(MAKE) -C contrib/mysql_fdw install +else +install_mysql_fdw: +endif + ifeq ($(enable_multiple_nodes), yes) -install: +install: install_mysql_fdw $(MAKE) -C contrib/hstore $@ $(MAKE) -C src/distribute/kernel/extension/packages $@ $(MAKE) -C contrib/pagehack $@ @@ -37,7 +45,7 @@ install: $(MAKE) -C src/distribute/kernel/extension/tsdb $@ +@echo "PostgreSQL installation complete." else -install: +install: install_mysql_fdw +@echo "openGauss installation complete." endif diff --git a/README.md b/README.md index e2aced10cd..5d42be4f12 100644 --- a/README.md +++ b/README.md @@ -513,6 +513,7 @@ Compilation log: **make_compile.log** > 2. On the ARM-based platform, **-D__USE_NUMA** needs to be added to **CFLAGS**. > 3. On the **ARMv8.1** platform or a later version (for example, Kunpeng 920), **-D__ARM_LSE** needs to be added to **CFLAGS**. > 4. If **binarylibs** is moved to **openGauss-server** or a soft link to **binarylibs** is created in **openGauss-server**, you do not need to specify the **--3rd** parameter. However, if you do so, please note that the file is easy to be deleted by the `git clean` command. + > 5. To build with mysql_fdw, add **--enable-mysql-fdw** when configure. Note that before build mysql_fdw, MariaDB's C client library is needed. 4. Run the following commands to compile openGauss: diff --git a/configure b/configure index dc77cd5d5a..e72c69476e 100755 --- a/configure +++ b/configure @@ -743,6 +743,7 @@ enable_jemalloc enable_jemalloc_debug enable_multiple_nodes enable_memory_check +enable_mysql_fdw enable_thread_check enable_shared default_gs_version @@ -819,6 +820,7 @@ enable_jemalloc enable_jemalloc_debug enable_multiple_nodes enable_memory_check +enable_mysql_fdw enable_thread_check enable_spinlocks enable_debug @@ -2845,6 +2847,28 @@ _ACEOF fi +# Check whether --enable-mysql-fdw was given. +if test "${enable_mysql_fdw+set}" = set; then + enableval=$enable_mysql_fdw; + case $enableval in + yes) + : + ;; + no) + : + ;; + *) + { { $as_echo "$as_me:$LINENO: error: no argument expected for --enable-mysql-fdw option" >&5 +$as_echo "$as_me: error: no argument expected for --enable-mysql-fdw option" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + +else + enable_mysql_fdw=no + +fi + # Check whether --enable-thread-check was given. if test "${enable_thread_check+set}" = set; then enableval=$enable_thread_check; diff --git a/contrib/mysql_fdw/Makefile b/contrib/mysql_fdw/Makefile new file mode 100644 index 0000000000..aaf59b8859 --- /dev/null +++ b/contrib/mysql_fdw/Makefile @@ -0,0 +1,54 @@ +# +# Copyright (c) 2020 Huawei Technologies Co.,Ltd. +# +# openGauss is licensed under Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# +# http://license.coscl.org.cn/MulanPSL2 +# +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +# See the Mulan PSL v2 for more details. +# --------------------------------------------------------------------------------------- +# +# Makefile +# Makefile for the mysql_fdw +# +# IDENTIFICATION +# contrib/mysql_fdw/Makefile +# +# --------------------------------------------------------------------------------------- + +all:mysql_fdw_target +install:install-data + +top_builddir ?= ../../ +MYSQL_FDW_DIR=$(top_builddir)/third_party/dependency/mysql_fdw +MYSQL_FDW_PACKAGE=mysql_fdw-REL-2_5_3 +MYSQL_FDW_PATCH=huawei_mysql_fdw-2.5.3_patch +MYSQL_FDW_MEGRED_SOURCES_DIR=$(MYSQL_FDW_DIR)/code + +.PHONY: mysql_fdw_target +mysql_fdw_target: + @$(call create_mysql_fdw_sources) + @make -C $(MYSQL_FDW_MEGRED_SOURCES_DIR)/$(MYSQL_FDW_PACKAGE) USE_PGXS=1 + +.PHONY: install-data +install-data: + @$(call create_mysql_fdw_sources) + @make -C $(MYSQL_FDW_MEGRED_SOURCES_DIR)/$(MYSQL_FDW_PACKAGE) USE_PGXS=1 install + +uninstall distclean clean: + @rm -rf $(MYSQL_FDW_MEGRED_SOURCES_DIR) + +MYSQL_FDW_RELEVANT_SOURCES = connection.c deparse.c mysql_fdw.c mysql_query.c option.c + +define create_mysql_fdw_sources + rm -rf $(MYSQL_FDW_MEGRED_SOURCES_DIR); \ + mkdir $(MYSQL_FDW_MEGRED_SOURCES_DIR); \ + tar xfzv $(MYSQL_FDW_DIR)/$(MYSQL_FDW_PACKAGE).tar.gz -C $(MYSQL_FDW_MEGRED_SOURCES_DIR) &> /dev/null; \ + rename ".c" ".cpp" $(MYSQL_FDW_MEGRED_SOURCES_DIR)/$(MYSQL_FDW_PACKAGE)/*.c; \ + patch -d $(MYSQL_FDW_MEGRED_SOURCES_DIR)/$(MYSQL_FDW_PACKAGE) < $(MYSQL_FDW_DIR)/$(MYSQL_FDW_PATCH).patch &> /dev/null; +endef diff --git a/src/Makefile b/src/Makefile index 16b7170cbe..23534197a7 100644 --- a/src/Makefile +++ b/src/Makefile @@ -68,6 +68,7 @@ install-local: installdirs-local $(INSTALL_DATA) Makefile.port '$(DESTDIR)$(pgxsdir)/$(subdir)/Makefile.port' $(INSTALL_DATA) $(srcdir)/Makefile.shlib '$(DESTDIR)$(pgxsdir)/$(subdir)/Makefile.shlib' $(INSTALL_DATA) $(srcdir)/nls-global.mk '$(DESTDIR)$(pgxsdir)/$(subdir)/nls-global.mk' + $(INSTALL_DATA) get_PlatForm_str.sh '$(DESTDIR)$(pgxsdir)/$(subdir)/get_PlatForm_str.sh' installdirs: installdirs-local @@ -77,7 +78,7 @@ installdirs-local: uninstall: uninstall-local uninstall-local: - rm -f $(addprefix '$(DESTDIR)$(pgxsdir)/$(subdir)'/, Makefile.global Makefile.port Makefile.shlib nls-global.mk) + rm -f $(addprefix '$(DESTDIR)$(pgxsdir)/$(subdir)'/, Makefile.global Makefile.port Makefile.shlib nls-global.mk get_PlatForm_str.sh) distprep: $(MAKE) -C test/isolation $@ diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 0855a5ee9c..23f197a14a 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -171,6 +171,7 @@ enable_cassert = @enable_cassert@ enable_jemalloc = @enable_jemalloc@ enable_jemalloc_debug = @enable_jemalloc_debug@ enable_multiple_nodes = @enable_multiple_nodes@ +enable_mysql_fdw = @enable_mysql_fdw@ enable_memory_check = @enable_memory_check@ enable_memory_check_core = @enable_memory_check_core@ enable_thread_check = @enable_thread_check@ diff --git a/src/common/backend/parser/analyze.cpp b/src/common/backend/parser/analyze.cpp index dffed5cf1d..68386f168c 100644 --- a/src/common/backend/parser/analyze.cpp +++ b/src/common/backend/parser/analyze.cpp @@ -868,7 +868,7 @@ static void CheckUnsupportInsertSelectClause(Query* query) AssertEreport(query->commandType == CMD_INSERT, MOD_OPT, "Only deal with CMD_INSERT commondType here"); if (result->relkind == RELKIND_FOREIGN_TABLE) { - if (isMOTFromTblOid(result->relid)) + if (isMOTFromTblOid(result->relid) || isMysqlFDWFromTblOid(result->relid)) return; if (list_length(query->rtable) == 1) diff --git a/src/gausskernel/Makefile b/src/gausskernel/Makefile index 5524d0c49f..ef68c13e92 100644 --- a/src/gausskernel/Makefile +++ b/src/gausskernel/Makefile @@ -27,6 +27,10 @@ SUBDIRS = ../common/backend bootstrap cbb optimizer process runtime security $(top_builddir)/contrib/file_fdw $(top_builddir)/contrib/hdfs_fdw \ $(top_builddir)/contrib/log_fdw $(top_builddir)/contrib/test_decoding $(top_builddir)/contrib/mppdb_decoding +ifeq ($(enable_mysql_fdw), yes) + SUBDIRS += $(top_builddir)/contrib/mysql_fdw +endif + ifeq ($(enable_multiple_nodes), yes) SUBDIRS += ../distribute/kernel ../distribute/kernel/extension/roach_api ../distribute/kernel/extension/dimsearch/main \ ../distribute/kernel/extension/tsdb diff --git a/src/gausskernel/optimizer/commands/extension.cpp b/src/gausskernel/optimizer/commands/extension.cpp index 8c5c528015..01a785876a 100755 --- a/src/gausskernel/optimizer/commands/extension.cpp +++ b/src/gausskernel/optimizer/commands/extension.cpp @@ -1087,15 +1087,9 @@ void CreateExtension(CreateExtensionStmt* stmt) errmsg("extension \"%s\" already exists in schema \"%s\", skipping", stmt->extname, schemaName))); return; } else { - /* - * Currently extension only support postgis. - */ - if (strstr(stmt->extname, "postgis")) - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_OBJECT), - errmsg("extension \"%s\" already exists in schema \"%s\"", stmt->extname, schemaName))); - else - FEATURE_NOT_PUBLIC_ERROR("EXTENSION is not yet supported."); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("extension \"%s\" already exists in schema \"%s\"", stmt->extname, schemaName))); } } diff --git a/src/gausskernel/optimizer/commands/functioncmds.cpp b/src/gausskernel/optimizer/commands/functioncmds.cpp index 9026aaceb7..b053047cbf 100755 --- a/src/gausskernel/optimizer/commands/functioncmds.cpp +++ b/src/gausskernel/optimizer/commands/functioncmds.cpp @@ -901,24 +901,6 @@ void CreateFunction(CreateFunctionStmt* stmt, const char* queryString) : 0))); languageOid = HeapTupleGetOid(languageTuple); - if (languageOid == JavalanguageId || (languageOid == ClanguageId && !IsInitdb)) { - /* - * single node dose not support Java UDF or other fenced functions. - * check it here because users may not know the Java UDF is fenced by default, - * so it's better to report detailed error messages for different senarios. - */ - if (IS_SINGLE_NODE) { - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("C/JAVA UDF is not yet supported in current version."))); - } - - /* only support fenced mode Java UDF */ - if (!fenced) { - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("C/Java UDF dose not support NOT FENCED functions."))); - } - } - languageStruct = (Form_pg_language)GETSTRUCT(languageTuple); /* Check user's privilege regardless of whether langugae is a trust type */ diff --git a/src/gausskernel/optimizer/plan/createplan.cpp b/src/gausskernel/optimizer/plan/createplan.cpp index bfd6424870..d356ff9454 100644 --- a/src/gausskernel/optimizer/plan/createplan.cpp +++ b/src/gausskernel/optimizer/plan/createplan.cpp @@ -8462,7 +8462,7 @@ ModifyTable* make_modifytable(CmdType operation, bool canSetTag, List* resultRel Plan* subplan = (Plan*)(linitial(subplans)); ForeignScan* fscan = NULL; if ((fscan = (ForeignScan*)FindForeignScan(subplan)) != NULL) { - if (!isMOTFromTblOid(fscan->scan_relid)) + if (!isMOTFromTblOid(fscan->scan_relid) && !isMysqlFDWFromTblOid(fscan->scan_relid)) ereport(ERROR, (errmodule(MOD_OPT), errcode(ERRCODE_FEATURE_NOT_SUPPORTED), diff --git a/src/gausskernel/process/tcop/utility.cpp b/src/gausskernel/process/tcop/utility.cpp index 0ffb60dbdb..0524a4d465 100755 --- a/src/gausskernel/process/tcop/utility.cpp +++ b/src/gausskernel/process/tcop/utility.cpp @@ -2572,14 +2572,6 @@ void standard_ProcessUtility(Node* parse_tree, const char* query_string, ParamLi break; case T_CreateForeignTableStmt: - if (!IsInitdb && IS_SINGLE_NODE && - !isMOTTableFromSrvName(((CreateForeignTableStmt*)parse_tree)->servername)) { - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("Current mode does not support FOREIGN table yet"), - errdetail("The feature is not currently supported"))); - } - /* fall through */ case T_CreateStmt: { #ifdef PGXC CreateCommand((CreateStmt*)parse_tree, query_string, params, is_top_level, sent_to_remote); @@ -2702,15 +2694,6 @@ void standard_ProcessUtility(Node* parse_tree, const char* query_string, ParamLi break; case T_CreateFdwStmt: -#ifdef PGXC - /* enable CREATE FOREIGN DATA WRAPPER when initdb */ - if (!IsInitdb && !u_sess->attr.attr_common.IsInplaceUpgrade) { - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("Postgres-XC does not support FOREIGN DATA WRAPPER yet"), - errdetail("The feature is not currently supported"))); - } -#endif CreateForeignDataWrapper((CreateFdwStmt*)parse_tree); #ifdef PGXC @@ -2720,22 +2703,10 @@ void standard_ProcessUtility(Node* parse_tree, const char* query_string, ParamLi break; case T_AlterFdwStmt: -#ifdef PGXC - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("Postgres-XC does not support FOREIGN DATA WRAPPER yet"), - errdetail("The feature is not currently supported"))); -#endif AlterForeignDataWrapper((AlterFdwStmt*)parse_tree); break; case T_CreateForeignServerStmt: - if (!IsInitdb && IS_SINGLE_NODE && (strcmp(((CreateForeignServerStmt*)parse_tree)->fdwname, MOT_FDW) != 0)) { - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("Current mode does not support FOREIGN server yet"), - errdetail("The feature is not currently supported"))); - } CreateForeignServer((CreateForeignServerStmt*)parse_tree); #ifdef PGXC if (IS_PGXC_COORDINATOR && !IsConnFromCoord() && !IsInitdb) @@ -2752,32 +2723,14 @@ void standard_ProcessUtility(Node* parse_tree, const char* query_string, ParamLi break; case T_CreateUserMappingStmt: -#ifdef PGXC - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("Postgres-XC does not support USER MAPPING yet"), - errdetail("The feature is not currently supported"))); -#endif CreateUserMapping((CreateUserMappingStmt*)parse_tree); break; case T_AlterUserMappingStmt: -#ifdef PGXC - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("Postgres-XC does not support USER MAPPING yet"), - errdetail("The feature is not currently supported"))); -#endif AlterUserMapping((AlterUserMappingStmt*)parse_tree); break; case T_DropUserMappingStmt: -#ifdef PGXC - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("Postgres-XC does not support USER MAPPING yet"), - errdetail("The feature is not currently supported"))); -#endif RemoveUserMapping((DropUserMappingStmt*)parse_tree); break; @@ -8664,7 +8617,7 @@ bool CheckExtensionInWhiteList(const char* extension_name, uint32 hash_value, bo } } - return false; + return true; } #ifdef ENABLE_MULTIPLE_NODES diff --git a/src/include/Makefile b/src/include/Makefile index bb5ee978b3..58e559111f 100755 --- a/src/include/Makefile +++ b/src/include/Makefile @@ -24,9 +24,10 @@ SUBDIRS = bootstrap catalog commands datatype executor foreign lib libpq mb \ port/win32/arpa port/win32/netinet port/win32/sys \ portability \ gtm \ - storage vecexecutor access tsdb \ + storage vecexecutor access access/obs tsdb \ hotpatch\ gstrace\ + knl knl/knl_guc threadpool workload\ # Install all headers install: all installdirs # These headers are needed by the public headers of the interfaces. @@ -48,6 +49,25 @@ install: all installdirs $(INSTALL_DATA) pg_config_os.h '$(DESTDIR)$(includedir_server)' $(INSTALL_DATA) utils/errcodes.h '$(DESTDIR)$(includedir_server)/utils' $(INSTALL_DATA) utils/fmgroids.h '$(DESTDIR)$(includedir_server)/utils' +# These headers are needed by fdw + $(INSTALL_DATA) gssignal/gs_signal.h '$(DESTDIR)$(includedir_server)/gssignal/gs_signal.h' + $(INSTALL_DATA) libcomm/libcomm.h '$(DESTDIR)$(includedir_server)/libcomm/libcomm.h' + $(INSTALL_DATA) cm/etcdapi.h '$(DESTDIR)$(includedir_server)/cm/etcdapi.h' + $(INSTALL_DATA) access/parallel_recovery/redo_item.h '$(DESTDIR)$(includedir_server)/access/parallel_recovery/redo_item.h' + $(INSTALL_DATA) access/parallel_recovery/posix_semaphore.h '$(DESTDIR)$(includedir_server)/access/parallel_recovery/posix_semaphore.h' + $(INSTALL_DATA) access/dfs/dfs_am.h '$(DESTDIR)$(includedir_server)/access/dfs/dfs_am.h' + $(INSTALL_DATA) alarm/alarm.h '$(DESTDIR)$(includedir_server)/alarm/alarm.h' + $(INSTALL_DATA) bulkload/dist_fdw.h '$(DESTDIR)$(includedir_server)/bulkload/dist_fdw.h' + $(INSTALL_DATA) bulkload/importerror.h '$(DESTDIR)$(includedir_server)/bulkload/importerror.h' + $(INSTALL_DATA) bulkload/utils.h '$(DESTDIR)$(includedir_server)/bulkload/utils.h' + $(INSTALL_DATA) ssl/gs_openssl_client.h '$(DESTDIR)$(includedir_server)/ssl/gs_openssl_client.h' + $(INSTALL_DATA) instruments/list.h '$(DESTDIR)$(includedir_server)/instruments/list.h' + $(INSTALL_DATA) instruments/instr_event.h '$(DESTDIR)$(includedir_server)/instruments/instr_event.h' + $(INSTALL_DATA) storage/dfs/dfs_connector.h '$(DESTDIR)$(includedir_server)/storage/dfs/dfs_connector.h' + $(INSTALL_DATA) distributelayer/streamConsumer.h '$(DESTDIR)$(includedir_server)/distributelayer/streamConsumer.h' + $(INSTALL_DATA) distributelayer/streamCore.h '$(DESTDIR)$(includedir_server)/distributelayer/streamCore.h' + $(INSTALL_DATA) distributelayer/streamProducer.h '$(DESTDIR)$(includedir_server)/distributelayer/streamProducer.h' + $(INSTALL_DATA) distributelayer/streamTransportCore.h '$(DESTDIR)$(includedir_server)/distributelayer/streamTransportCore.h' # We don't use INSTALL_DATA for performance reasons --- there are a lot of files cp $(srcdir)/*.h '$(DESTDIR)$(includedir_server)'/ || exit; \ chmod $(INSTALL_DATA_MODE) '$(DESTDIR)$(includedir_server)'/*.h || exit; \ diff --git a/src/include/foreign/foreign.h b/src/include/foreign/foreign.h index 832d0629db..2b270f5483 100644 --- a/src/include/foreign/foreign.h +++ b/src/include/foreign/foreign.h @@ -282,6 +282,9 @@ bool isWriteOnlyFt(Oid relid); #define isMOTTableFromSrvName(srvName) \ (IsSpecifiedFDW(srvName, MOT_FDW)) +#define isMysqlFDWFromTblOid(relId) \ + (IsSpecifiedFDWFromRelid(relId, MYSQL_FDW)) + #define IS_OBS_CSV_TXT_FOREIGN_TABLE(relId) \ (IsSpecifiedFDWFromRelid(relId, DIST_FDW) && (is_obs_protocol(HdfsGetOptionValue(relId, optLocation)))) diff --git a/src/include/postgres.h b/src/include/postgres.h index 6866592ebc..f907032e7c 100644 --- a/src/include/postgres.h +++ b/src/include/postgres.h @@ -74,6 +74,10 @@ #define DIST_FDW "dist_fdw" #endif +#ifndef MYSQL_FDW +#define MYSQL_FDW "mysql_fdw" +#endif + #ifndef MOT_FDW #define MOT_FDW "mot_fdw" #endif diff --git a/src/test/regress/expected/create_view1.out b/src/test/regress/expected/create_view1.out index ea3ff9bef5..66fa917cdd 100644 --- a/src/test/regress/expected/create_view1.out +++ b/src/test/regress/expected/create_view1.out @@ -18,11 +18,10 @@ CREATE VIEW iexit AS interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE ih.thepath ## r.thepath; -ERROR: function interpt_pp(path, path) does not exist -LINE 3: interpt_pp(ih.thepath, r.thepath) AS exit - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: exit +ERROR: operator does not exist: path ## path +LINE 5: WHERE ih.thepath ## r.thepath; + ^ +HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. CREATE VIEW toyemp AS SELECT name, age, location, 12*salary AS annualsal FROM emp; diff --git a/src/test/regress/expected/hw_sql_llt.out b/src/test/regress/expected/hw_sql_llt.out index de323244a3..63f70a1e4c 100644 --- a/src/test/regress/expected/hw_sql_llt.out +++ b/src/test/regress/expected/hw_sql_llt.out @@ -375,13 +375,13 @@ CREATE OR REPLACE FUNCTION my_union(internal, internal) RETURNS test_func_user.internal AS 'MODULE_PATHNAME' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type "test_func_user.internal" does not exist set enforce_a_behavior=off; CREATE OR REPLACE FUNCTION my_union(internal, internal) RETURNS test_func_user.internal AS 'MODULE_PATHNAME' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type "test_func_user.internal" does not exist reset enforce_a_behavior; --function CreateFunction revoke create on schema test_func_user from test_func_user; diff --git a/src/test/regress/output/create_basetype.source b/src/test/regress/output/create_basetype.source index 23fc80247b..867499dbe6 100644 --- a/src/test/regress/output/create_basetype.source +++ b/src/test/regress/output/create_basetype.source @@ -3,22 +3,22 @@ CREATE FUNCTION complex_in(cstring) RETURNS complex AS '@libdir@/regress@DLSUFFIX@','complex_in' LANGUAGE C IMMUTABLE STRICT not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. +NOTICE: return type complex is only a shell CREATE FUNCTION complex_out(complex) RETURNS cstring AS '@libdir@/regress@DLSUFFIX@','complex_out' LANGUAGE C IMMUTABLE STRICT not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. +NOTICE: argument type complex is only a shell CREATE FUNCTION complex_recv(internal) RETURNS complex AS '@libdir@/regress@DLSUFFIX@','complex_recv' LANGUAGE C IMMUTABLE STRICT not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. +NOTICE: return type complex is only a shell CREATE FUNCTION complex_send(complex) RETURNS bytea AS '@libdir@/regress@DLSUFFIX@','complex_send' LANGUAGE C IMMUTABLE STRICT not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. +NOTICE: argument type complex is only a shell CREATE TYPE complex ( internallength = 16, input = complex_in, @@ -27,73 +27,56 @@ CREATE TYPE complex ( send = complex_send, alignment = double ); -ERROR: function complex_in(cstring) does not exist create table t1 ( sk int, a complex, b complex ) WITH (orientation=row); -ERROR: type "complex" is only a shell -LINE 3: a complex, - ^ insert into t1 values(1,'(1,2)','(2,3)'); -ERROR: relation "t1" does not exist on datanode1 -LINE 1: insert into t1 values(1,'(1,2)','(2,3)'); - ^ insert into t1 values(1,'(3,4)','(4,5)'); -ERROR: relation "t1" does not exist on datanode1 -LINE 1: insert into t1 values(1,'(3,4)','(4,5)'); - ^ select * from t1; -ERROR: relation "t1" does not exist on datanode1 -LINE 1: select * from t1; - ^ + sk | a | b +----+-------+------- + 1 | (1,2) | (2,3) + 1 | (3,4) | (4,5) +(2 rows) + create table t1_rep ( sk int, a complex, b complex ) WITH (orientation=row) ; -ERROR: type "complex" is only a shell -LINE 3: a complex, - ^ insert into t1_rep values(1,'(1,2)','(2,3)'); -ERROR: relation "t1_rep" does not exist on datanode1 -LINE 1: insert into t1_rep values(1,'(1,2)','(2,3)'); - ^ insert into t1_rep values(1,'(3,4)','(4,5)'); -ERROR: relation "t1_rep" does not exist on datanode1 -LINE 1: insert into t1_rep values(1,'(3,4)','(4,5)'); - ^ select * from t1_rep; -ERROR: relation "t1_rep" does not exist on datanode1 -LINE 1: select * from t1_rep; - ^ + sk | a | b +----+-------+------- + 1 | (1,2) | (2,3) + 1 | (3,4) | (4,5) +(2 rows) + insert into t1 values(1,'(1,2)','(2,3)'); -ERROR: relation "t1" does not exist on datanode1 -LINE 1: insert into t1 values(1,'(1,2)','(2,3)'); - ^ insert into t1 values(1,'(3,4)','(4,5)'); -ERROR: relation "t1" does not exist on datanode1 -LINE 1: insert into t1 values(1,'(3,4)','(4,5)'); - ^ CREATE FUNCTION test_type(complex) RETURNS complex AS 'select $1;' LANGUAGE SQL; -ERROR: SQL function cannot accept shell type complex call test_type(cast('(1,2)' as complex)); -ERROR: function "test_type" doesn't exist + test_type +----------- + (1,2) +(1 row) + create schema schema1; alter type complex set schema schema1; -ERROR: type "complex" is only a shell create table t1_schema_test1 ( sk int, a complex, b complex ) WITH (orientation=row); -ERROR: type "complex" is only a shell +ERROR: type "complex" does not exist LINE 3: a complex, ^ set current_schema = schema1; @@ -103,22 +86,27 @@ a complex, b complex ) WITH (orientation=row); -ERROR: type "complex" does not exist -LINE 3: a complex, - ^ alter type complex set schema public; -ERROR: type "complex" does not exist set current_schema = public; alter type complex rename to complex_1; -ERROR: type "complex" is only a shell alter type complex_1 rename to complex; -ERROR: type "complex_1" does not exist drop type complex cascade; +NOTICE: drop cascades to 11 other objects +DETAIL: drop cascades to function complex_in(cstring) +drop cascades to function complex_out(complex) +drop cascades to function complex_recv(internal) +drop cascades to function complex_send(complex) +drop cascades to table t1 column a +drop cascades to table t1 column b +drop cascades to table t1_rep column a +drop cascades to table t1_rep column b +drop cascades to function test_type(complex) +drop cascades to table schema1.t1_schema_test2 column a +drop cascades to table schema1.t1_schema_test2 column b drop schema schema1 cascade; +NOTICE: drop cascades to table schema1.t1_schema_test2 drop table t1; -ERROR: table "t1" does not exist drop table t1_rep; -ERROR: table "t1_rep" does not exist \h create type Command: CREATE TYPE Description: define a new data type diff --git a/src/test/regress/output/create_c_function.source b/src/test/regress/output/create_c_function.source index 6855ae1bfd..252b193136 100644 --- a/src/test/regress/output/create_c_function.source +++ b/src/test/regress/output/create_c_function.source @@ -7,54 +7,59 @@ CREATE FUNCTION vec_int4add_0() RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION vec_int4add_0_strict() RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C strict IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. select * from test_vec_int4add where vec_int4add_0() > 0 order by 1,2,3,4; -ERROR: function vec_int4add_0() does not exist -LINE 1: select * from test_vec_int4add where vec_int4add_0() > 0 o... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. + t1 | t2 | t3 | t4 +----+----+----+---- + 1 | 2 | 3 | 4 + 5 | 6 | 7 | 8 +(2 rows) + select * from test_vec_int4add where vec_int4add_0_strict() > 0 order by 1,2,3,4; -ERROR: function vec_int4add_0_strict() does not exist -LINE 1: select * from test_vec_int4add where vec_int4add_0_strict(... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. + t1 | t2 | t3 | t4 +----+----+----+---- + 1 | 2 | 3 | 4 + 5 | 6 | 7 | 8 +(2 rows) + CREATE FUNCTION vec_int4add_1(int) RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. select * from test_vec_int4add where vec_int4add_1(t1) > 0 order by 1,2,3,4; -ERROR: function vec_int4add_1(integer) does not exist -LINE 1: select * from test_vec_int4add where vec_int4add_1(t1) > 0... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. + t1 | t2 | t3 | t4 +----+----+----+---- + 1 | 2 | 3 | 4 + 5 | 6 | 7 | 8 +(2 rows) + CREATE FUNCTION vec_int4add_11(int4, int4,int4,int4,int4,int4,int4,int4,int4,int4,int4) RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION vec_int4add_11_strict(int4, int4,int4,int4,int4,int4,int4,int4,int4,int4,int4) RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C strict IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. select * from test_vec_int4add where vec_int4add_11(t1,t2,t3,t4,t1,t2,t3,t4,t1,t2,t3) > 0 order by 1,2,3,4; -ERROR: function vec_int4add_11(integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer) does not exist -LINE 1: select * from test_vec_int4add where vec_int4add_11(t1,t2,... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. + t1 | t2 | t3 | t4 +----+----+----+---- + 1 | 2 | 3 | 4 + 5 | 6 | 7 | 8 +(2 rows) + select * from test_vec_int4add where vec_int4add_11_strict(t1,t2,t3,t4,t1,t2,t3,t4,t1,t2,t3) > 0 order by 1,2,3,4; -ERROR: function vec_int4add_11_strict(integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer) does not exist -LINE 1: select * from test_vec_int4add where vec_int4add_11_strict... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. + t1 | t2 | t3 | t4 +----+----+----+---- + 1 | 2 | 3 | 4 + 5 | 6 | 7 | 8 +(2 rows) + CREATE FUNCTION vec_int4add_32 (int4,int4,int4,int4,int4,int4,int4,int4 ,int4,int4,int4,int4,int4,int4,int4,int4 @@ -63,7 +68,6 @@ CREATE FUNCTION vec_int4add_32 RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION vec_int4add_32_strict (int4,int4,int4,int4,int4,int4,int4,int4 ,int4,int4,int4,int4,int4,int4,int4,int4 @@ -72,25 +76,28 @@ CREATE FUNCTION vec_int4add_32_strict RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C strict IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. select * from test_vec_int4add where vec_int4add_32 (t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4) > 0 order by 1,2,3,4; -ERROR: function vec_int4add_32(integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer) does not exist -LINE 1: select * from test_vec_int4add where vec_int4add_32 - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. + t1 | t2 | t3 | t4 +----+----+----+---- + 1 | 2 | 3 | 4 + 5 | 6 | 7 | 8 +(2 rows) + select * from test_vec_int4add where vec_int4add_32 (t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4) > 0 order by 1,2,3,4; -ERROR: function vec_int4add_32(integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer) does not exist -LINE 1: select * from test_vec_int4add where vec_int4add_32 - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. + t1 | t2 | t3 | t4 +----+----+----+---- + 1 | 2 | 3 | 4 + 5 | 6 | 7 | 8 +(2 rows) + CREATE FUNCTION vec_int4add_33 (int4,int4,int4,int4,int4,int4,int4,int4 ,int4,int4,int4,int4,int4,int4,int4,int4 @@ -100,52 +107,51 @@ CREATE FUNCTION vec_int4add_33 RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. select * from test_vec_int4add where vec_int4add_33 (t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4 ,t1,t2,t3,t4,t1,t2,t3,t4 ,t1) > 0 order by 1,2,3,4; -ERROR: function vec_int4add_33(integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer) does not exist -LINE 1: select * from test_vec_int4add where vec_int4add_33 - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. + t1 | t2 | t3 | t4 +----+----+----+---- + 1 | 2 | 3 | 4 + 5 | 6 | 7 | 8 +(2 rows) + CREATE FUNCTION test_int4add_0() RETURNS int4 AS '@abs_srcdir@/regress.so', 'vec_int4add_0' LANGUAGE C IMMUTABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE OR REPLACE FUNCTION func(text) RETURNS text AS '@abs_srcdir@/regress.so', 'funcA' LANGUAGE C STABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE OR REPLACE FUNCTION func(int) RETURNS text AS '@abs_srcdir@/regress.so', 'funcB' LANGUAGE C STABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. select func(1); -ERROR: function func(integer) does not exist -LINE 1: select func(1); - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: func + func +------- + funcB +(1 row) + select func('1'); -ERROR: function func(unknown) does not exist -LINE 1: select func('1'); - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: func + func +------- + funcA +(1 row) + CREATE OR REPLACE FUNCTION funcC(int) RETURNS text AS '@abs_srcdir@/regress.so', 'funcC' LANGUAGE C STABLE not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. +WARNING: Function "funcC" is not declared as PG_FUNCTION_INFO_V1() +HINT: SQL-callable C-functions recommends accompanying PG_FUNCTION_INFO_V1(funcC). select funcC(1); -ERROR: function funcc(integer) does not exist -LINE 1: select funcC(1); - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: funcc + funcc +------- + funcC +(1 row) + --test for enable normal user create c function create user c_function_user1 password 'ttest@123'; create user c_function_user2 password 'ttest@123'; @@ -154,18 +160,16 @@ CREATE OR REPLACE FUNCTION c_function_user1.funcA(text,name) RETURNS tid AS '@abs_srcdir@/regress.so', 'funcA' LANGUAGE C STABLE NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE OR REPLACE FUNCTION c_function_user2.funcA(text,name) RETURNS tid AS '@abs_srcdir@/regress.so', 'funcA' LANGUAGE C STABLE NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. set role c_function_user1 password 'ttest@123'; CREATE OR REPLACE FUNCTION funcA(text,name) RETURNS tid AS '@abs_srcdir@/regress.so', 'funcA' LANGUAGE C STABLE NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: permission denied for language c grant usage on language c to c_function_user1; ERROR: permission denied for language c reset role; @@ -188,12 +192,10 @@ CREATE OR REPLACE FUNCTION funcA(text,name) RETURNS tid AS '@abs_srcdir@/regress.so', 'funcA' LANGUAGE C STABLE NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE OR REPLACE FUNCTION c_function_user2.funcA(text,name) RETURNS tid AS '@abs_srcdir@/regress.so', 'funcA' LANGUAGE C STABLE NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. reset role; select proname,proowner,rolname from pg_proc a inner join pg_authid b on a.proowner = b.oid where proname = 'funcA'; proname | proowner | rolname @@ -221,4 +223,17 @@ select has_language_privilege('c_function_user2','c','USAGE'); drop user c_function_user1 cascade; drop user c_function_user2 cascade; drop schema vec_function_call cascade; -NOTICE: drop cascades to table test_vec_int4add +NOTICE: drop cascades to 13 other objects +DETAIL: drop cascades to table test_vec_int4add +drop cascades to function vec_int4add_0() +drop cascades to function vec_int4add_0_strict() +drop cascades to function vec_int4add_1(integer) +drop cascades to function vec_int4add_11(integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer) +drop cascades to function vec_int4add_11_strict(integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer) +drop cascades to function vec_int4add_32(integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer) +drop cascades to function vec_int4add_32_strict(integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer) +drop cascades to function vec_int4add_33(integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer,integer) +drop cascades to function test_int4add_0() +drop cascades to function func(text) +drop cascades to function func(integer) +drop cascades to function funcc(integer) diff --git a/src/test/regress/output/create_function_1.source b/src/test/regress/output/create_function_1.source index d14b4a4389..f44be820eb 100644 --- a/src/test/regress/output/create_function_1.source +++ b/src/test/regress/output/create_function_1.source @@ -5,57 +5,50 @@ CREATE FUNCTION widget_in(cstring) RETURNS widget AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type "widget" does not exist CREATE FUNCTION widget_out(widget) RETURNS cstring AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type widget does not exist CREATE FUNCTION int44in(cstring) RETURNS city_budget AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type "city_budget" does not exist CREATE FUNCTION int44out(city_budget) RETURNS cstring AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type city_budget does not exist CREATE FUNCTION check_primary_key () RETURNS trigger AS '@libdir@/refint@DLSUFFIX@' LANGUAGE C NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION check_foreign_key () RETURNS trigger AS '@libdir@/refint@DLSUFFIX@' LANGUAGE C NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION autoinc () RETURNS trigger AS '@libdir@/autoinc@DLSUFFIX@' LANGUAGE C NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION funny_dup17 () RETURNS trigger AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION ttdummy () RETURNS trigger AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION set_ttdummy (int4) RETURNS int4 AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION test_atomic_ops() RETURNS bool AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. -- Things that shouldn't work: CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL AS 'SELECT ''not an integer'';'; @@ -82,10 +75,10 @@ CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL ERROR: only one AS item needed for language "sql" CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C AS 'nosuchfile'; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: could not access file "nosuchfile": No such file or directory CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol' NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. +--?ERROR: could not find function "nosuchsymbol" in file "@libdir@/.*regress@DLSUFFIX@" CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal AS 'nosuch'; ERROR: there is no built-in function named "nosuch" diff --git a/src/test/regress/output/misc.source b/src/test/regress/output/misc.source index eb355c80b6..035dcda6b0 100644 --- a/src/test/regress/output/misc.source +++ b/src/test/regress/output/misc.source @@ -27,21 +27,11 @@ UPDATE tmp FROM onek WHERE onek.stringu1 = 'JBAAAA' and onek.stringu1 = tmp.stringu1; -ERROR: function reverse_name(name) does not exist -LINE 2: SET stringu1 = reverse_name(onek.stringu1) - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: stringu1 UPDATE tmp SET stringu1 = reverse_name(onek2.stringu1) FROM onek2 WHERE onek2.stringu1 = 'JCAAAA' and onek2.stringu1 = tmp.stringu1; -ERROR: function reverse_name(name) does not exist -LINE 2: SET stringu1 = reverse_name(onek2.stringu1) - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: stringu1 DROP TABLE tmp; --UPDATE person* -- SET age = age + 1; @@ -388,30 +378,30 @@ SELECT user_relns() AS user_relns onek onek2 person - pg_cudesc_17900 - pg_cudesc_part_17746 - pg_cudesc_part_17747 - pg_cudesc_part_17748 - pg_cudesc_part_17749 - pg_cudesc_part_17750 - pg_cudesc_part_17751 - pg_cudesc_part_17752 - pg_cudesc_part_17753 - pg_cudesc_part_17754 - pg_cudesc_part_17755 - pg_cudesc_part_17756 - pg_delta_17900 - pg_delta_part_17746 - pg_delta_part_17747 - pg_delta_part_17748 - pg_delta_part_17749 - pg_delta_part_17750 - pg_delta_part_17751 - pg_delta_part_17752 - pg_delta_part_17753 - pg_delta_part_17754 - pg_delta_part_17755 - pg_delta_part_17756 + pg_cudesc_17913 + pg_cudesc_part_17759 + pg_cudesc_part_17760 + pg_cudesc_part_17761 + pg_cudesc_part_17762 + pg_cudesc_part_17763 + pg_cudesc_part_17764 + pg_cudesc_part_17765 + pg_cudesc_part_17766 + pg_cudesc_part_17767 + pg_cudesc_part_17768 + pg_cudesc_part_17769 + pg_delta_17913 + pg_delta_part_17759 + pg_delta_part_17760 + pg_delta_part_17761 + pg_delta_part_17762 + pg_delta_part_17763 + pg_delta_part_17764 + pg_delta_part_17765 + pg_delta_part_17766 + pg_delta_part_17767 + pg_delta_part_17768 + pg_delta_part_17769 ramp real_city road @@ -487,11 +477,13 @@ SELECT person as hobbies_by_name from hobbies_r where name = 'basketball' order (2 rows) SELECT name, overpaid(emp.*) FROM emp ORDER BY 1,2; -ERROR: function overpaid(emp) does not exist -LINE 1: SELECT name, overpaid(emp.*) FROM emp ORDER BY 1,2; - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: overpaid + name | overpaid +--------+---------- + bill | t + sam | t + sharon | t +(3 rows) + -- -- Try a few cases with SQL-spec row constructor expressions -- @@ -536,11 +528,14 @@ insert into oldstyle_test values(0,'12'); insert into oldstyle_test values(1000,'12'); insert into oldstyle_test values(0, repeat('x', 50000)); select i, length(t), octet_length(t), oldstyle_length(i,t) from oldstyle_test ORDER BY 1,2,3; -ERROR: function oldstyle_length(integer, text) does not exist -LINE 1: select i, length(t), octet_length(t), oldstyle_length(i,t) f... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: oldstyle_length + i | length | octet_length | oldstyle_length +------+--------+--------------+----------------- + 0 | 2 | 2 | 822333 + 0 | 50000 | 50000 | 581 + 1000 | 2 | 2 | 823333 + | | | +(4 rows) + drop table oldstyle_test; select pg_terminate_backend(9999999999); WARNING: PID 9999999999 is not a gaussdb server thread diff --git a/src/test/regress/output/single_node_create_function_1.source b/src/test/regress/output/single_node_create_function_1.source index 28aa115415..27cb085c3e 100644 --- a/src/test/regress/output/single_node_create_function_1.source +++ b/src/test/regress/output/single_node_create_function_1.source @@ -5,52 +5,46 @@ CREATE FUNCTION widget_in(cstring) RETURNS widget AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type "widget" does not exist CREATE FUNCTION widget_out(widget) RETURNS cstring AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type widget does not exist CREATE FUNCTION int44in(cstring) RETURNS city_budget AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type "city_budget" does not exist CREATE FUNCTION int44out(city_budget) RETURNS cstring AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type city_budget does not exist CREATE FUNCTION check_primary_key () RETURNS trigger AS '@libdir@/refint@DLSUFFIX@' LANGUAGE C; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION check_foreign_key () RETURNS trigger AS '@libdir@/refint@DLSUFFIX@' LANGUAGE C; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION autoinc () RETURNS trigger AS '@libdir@/autoinc@DLSUFFIX@' LANGUAGE C; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION funny_dup17 () RETURNS trigger AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION ttdummy () RETURNS trigger AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION set_ttdummy (int4) RETURNS int4 AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. -- Things that shouldn't work: CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL AS 'SELECT ''not an integer'';'; @@ -77,10 +71,10 @@ CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL ERROR: only one AS item needed for language "sql" CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C AS 'nosuchfile'; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: could not access file "nosuchfile": No such file or directory CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C AS '@libdir@/regress@DLSUFFIX@', 'nosuchsymbol'; -ERROR: C/JAVA UDF is not yet supported in current version. +--?ERROR: could not find function "nosuchsymbol" in file "@libdir@/.*regress@DLSUFFIX@" CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal AS 'nosuch'; ERROR: there is no built-in function named "nosuch" diff --git a/src/test/regress/output/single_node_forbidden.source b/src/test/regress/output/single_node_forbidden.source index ee9747c101..4f782a6785 100644 --- a/src/test/regress/output/single_node_forbidden.source +++ b/src/test/regress/output/single_node_forbidden.source @@ -16,7 +16,6 @@ CREATE FUNCTION java_getSystemProperty(VARCHAR) RETURNS VARCHAR AS 'java.lang.System.getProperty' LANGUAGE java NOT FENCED; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION java_getSystemProperty(VARCHAR) RETURNS VARCHAR AS 'java.lang.System.getProperty' diff --git a/src/test/regress/output/temp__3.source b/src/test/regress/output/temp__3.source index b54ac733b4..83be3c33c5 100644 --- a/src/test/regress/output/temp__3.source +++ b/src/test/regress/output/temp__3.source @@ -2,12 +2,12 @@ CREATE FUNCTION int44in(cstring) RETURNS city_budget AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type "city_budget" does not exist CREATE FUNCTION int44out(city_budget) RETURNS cstring AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C STRICT; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type city_budget does not exist CREATE TYPE city_budget ( internallength = 16, diff --git a/src/test/regress/output/temp__4.source b/src/test/regress/output/temp__4.source index abeb6edabd..c3ae7d409a 100644 --- a/src/test/regress/output/temp__4.source +++ b/src/test/regress/output/temp__4.source @@ -2,17 +2,15 @@ CREATE FUNCTION pt_in_widget(point, widget) RETURNS bool AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. +ERROR: type widget does not exist CREATE FUNCTION interpt_pp(path, path) RETURNS point AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION reverse_name(name) RETURNS name AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION user_relns() RETURNS setof name AS 'select relname @@ -42,7 +40,6 @@ CREATE FUNCTION overpaid(emp) RETURNS bool AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION equipment(hobbies_r) RETURNS setof equipment_r AS 'select * from equipment_r where hobby = $1.name' @@ -51,7 +48,6 @@ CREATE FUNCTION oldstyle_length(int4, text) RETURNS int4 AS '@libdir@/regress@DLSUFFIX@' LANGUAGE C not fenced; -ERROR: C/JAVA UDF is not yet supported in current version. CREATE FUNCTION equipment_named(hobby hobbies_r) RETURNS setof equipment_r AS 'select * from equipment_r where equipment_r.hobby = equipment_named.hobby.name' diff --git a/src/test/regress/output/udf_crem.source b/src/test/regress/output/udf_crem.source index 6ab030fc13..7ebfe3a3b6 100644 --- a/src/test/regress/output/udf_crem.source +++ b/src/test/regress/output/udf_crem.source @@ -9,14 +9,12 @@ CREATE OR REPLACE FUNCTION PUBLIC.trunc(int, int) RETURNS int AS '@libdir@/regress@DLSUFFIX@','truncInt' LANGUAGE c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.trunc(float4, int); NOTICE: function public.trunc(float4,pg_catalog.int4) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.trunc(float4, int) RETURNS float8 AS '@libdir@/regress@DLSUFFIX@','truncFloat' LANGUAGE c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS public.trunc(numeric, int); NOTICE: function public.trunc(pg_catalog.numeric,pg_catalog.int4) does not exist, skipping CREATE OR REPLACE FUNCTION public.trunc(numeric, int default 0) RETURNS numeric @@ -28,42 +26,36 @@ CREATE OR REPLACE FUNCTION PUBLIC.TransDate(varchar(50), int, varchar(50)) RETURNS varchar(50) AS '@libdir@/regress@DLSUFFIX@','TransDate' LANGUAGE c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.TransTimestamp(varchar(50), int, varchar(50)); NOTICE: function public.transtimestamp(pg_catalog.varchar,pg_catalog.int4,pg_catalog.varchar) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.TransTimestamp(varchar(50), int, varchar(50)) RETURNS varchar(50) AS '@libdir@/regress@DLSUFFIX@','TransTimestamp' LANGUAGE c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.sign(float4); NOTICE: function public.sign(float4) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.sign(float4) RETURNS int AS '@libdir@/regress@DLSUFFIX@','signf' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.sign(int); NOTICE: function public.sign(pg_catalog.int4) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.sign(int) RETURNS int AS '@libdir@/regress@DLSUFFIX@','signi' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.rpad(text, numeric, text); NOTICE: function public.rpad(text,pg_catalog.numeric,text) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.rpad(text, numeric, text default ' ') RETURNS text AS '@libdir@/regress@DLSUFFIX@','rpad_f' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.round(int, int); NOTICE: function public.round(pg_catalog.int4,pg_catalog.int4) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.round(int, int default 0) RETURNS int AS '@libdir@/regress@DLSUFFIX@','RoundInt' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.round(float, int); NOTICE: function public.round(pg_catalog.float8,pg_catalog.int4) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.round(float, int default 0) @@ -87,17 +79,11 @@ CREATE OR REPLACE FUNCTION PUBLIC.NormsDistInner(NUMERIC) RETURNS NUMERIC AS '@libdir@/regress@DLSUFFIX@','normsdist' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.NormsDist; NOTICE: function public.normsdist() does not exist, skipping CREATE FUNCTION PUBLIC.NormsDist(NUMERIC(18,15)) RETURNS NUMERIC(18,15) AS 'select public.NormsDistInner($1)::NUMERIC(18,15)' LANGUAGE SQL strict IMMUTABLE; -ERROR: function public.normsdistinner(numeric) does not exist -LINE 2: AS 'select public.NormsDistInner($1)::NUMERIC(18,15)' - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: normsdistinner -- DROP FUNCTION IF EXISTS PUBLIC.months_between_inner(date, date); NOTICE: function public.months_between_inner(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping @@ -105,99 +91,65 @@ CREATE OR REPLACE FUNCTION PUBLIC.months_between_inner(date, date) RETURNS FLOAT4 AS '@libdir@/regress@DLSUFFIX@','months_between_dd' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.months_between(date, date); NOTICE: function public.months_between(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.months_between(date, date) RETURNS NUMERIC(18,2) AS 'select (public.months_between_inner($1, $2)::float)::NUMERIC(18,2)' LANGUAGE SQL strict IMMUTABLE; -ERROR: function public.months_between_inner(timestamp without time zone, timestamp without time zone) does not exist -LINE 2: AS 'select (public.months_between_inner($1, $2)::float):... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: months_between_inner -- DROP FUNCTION IF EXISTS PUBLIC.months_between_inner(date, timestamp); -NOTICE: function public.months_between_inner(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.months_between_inner(date, timestamp) RETURNS FLOAT4 AS '@libdir@/regress@DLSUFFIX@','months_between_dt' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.months_between(date, timestamp); -NOTICE: function public.months_between(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.months_between(date, timestamp) RETURNS NUMERIC(18,2) AS 'select (public.months_between_inner($1, $2)::float)::NUMERIC(18,2)' LANGUAGE SQL strict IMMUTABLE; -ERROR: function public.months_between_inner(timestamp without time zone, timestamp without time zone) does not exist -LINE 2: AS 'select (public.months_between_inner($1, $2)::float):... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: months_between_inner -- DROP FUNCTION IF EXISTS PUBLIC.months_between_inner(timestamp, date); -NOTICE: function public.months_between_inner(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.months_between_inner(timestamp, date) RETURNS FLOAT4 AS '@libdir@/regress@DLSUFFIX@','months_between_td' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.months_between(timestamp, date); -NOTICE: function public.months_between(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.months_between(timestamp, date) RETURNS NUMERIC(18,2) AS 'select (public.months_between_inner($1, $2)::float)::NUMERIC(18,2)' LANGUAGE SQL strict IMMUTABLE; -ERROR: function public.months_between_inner(timestamp without time zone, timestamp without time zone) does not exist -LINE 2: AS 'select (public.months_between_inner($1, $2)::float):... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: months_between_inner -- DROP FUNCTION IF EXISTS PUBLIC.months_between_inner(timestamp, timestamp); -NOTICE: function public.months_between_inner(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.months_between_inner(timestamp, timestamp) RETURNS FLOAT4 AS '@libdir@/regress@DLSUFFIX@','months_between_tt' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.months_between(timestamp, timestamp); -NOTICE: function public.months_between(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.months_between(timestamp, timestamp) RETURNS NUMERIC(18,2) AS 'select (public.months_between_inner($1, $2)::float)::NUMERIC(18,2)' LANGUAGE SQL strict IMMUTABLE; -ERROR: function public.months_between_inner(timestamp without time zone, timestamp without time zone) does not exist -LINE 2: AS 'select (public.months_between_inner($1, $2)::float):... - ^ -HINT: No function matches the given name and argument types. You might need to add explicit type casts. -CONTEXT: referenced column: months_between_inner DROP FUNCTION IF EXISTS PUBLIC.lpad(text, numeric, text); NOTICE: function public.lpad(text,pg_catalog.numeric,text) does not exist, skipping CREATE OR REPLACE FUNCTION PUBLIC.lpad(text, numeric, text default ' ') RETURNS text AS '@libdir@/regress@DLSUFFIX@','lpad_f' LANGUAGE c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS public.FUNC_III_CS0507_3; NOTICE: function public.func_iii_cs0507_3() does not exist, skipping CREATE FUNCTION FUNC_III_CS0507_3(in NUMERIC(18,4)) returns text as '@libdir@/regress@DLSUFFIX@','FUNC_III_CS0507_3' language c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS public.FUNC_III_CS0507; NOTICE: function public.func_iii_cs0507() does not exist, skipping CREATE FUNCTION FUNC_III_CS0507(in NUMERIC(18,4)) returns text as '@libdir@/regress@DLSUFFIX@','FUNC_III_CS0507' language c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS public.FUNC_II_JUDGE_DF_AGE; NOTICE: function public.func_ii_judge_df_age() does not exist, skipping CREATE FUNCTION FUNC_II_JUDGE_DF_AGE(in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4), in NUMERIC(18,4)) returns int as '@libdir@/regress@DLSUFFIX@','FUNC_II_JUDGE_DF_AGE' language c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. -- FUNC_TRANS_MOBCODE DROP FUNCTION IF EXISTS public.FUNC_TRANS_MOBCODE; NOTICE: function public.func_trans_mobcode() does not exist, skipping @@ -205,7 +157,6 @@ CREATE FUNCTION FUNC_TRANS_MOBCODE(in NUMERIC(18,4)) returns text as '@libdir@/regress@DLSUFFIX@','FUNC_TRANS_MOBCODE' language c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. -- FUNC_TRANS_RISKCODE DROP FUNCTION IF EXISTS public.FUNC_TRANS_RISKCODE; NOTICE: function public.func_trans_riskcode() does not exist, skipping @@ -213,7 +164,6 @@ CREATE FUNCTION FUNC_TRANS_RISKCODE(in text, in NUMERIC(18,4)) returns text as '@libdir@/regress@DLSUFFIX@','FUNC_TRANS_RISKCODE' language c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. -- FUNC_XW_FIX_DPD DROP FUNCTION IF EXISTS public.FUNC_XW_FIX_DPD; NOTICE: function public.func_xw_fix_dpd() does not exist, skipping @@ -221,7 +171,6 @@ CREATE FUNCTION FUNC_XW_FIX_DPD(in text, in NUMERIC(18,4)) returns int as '@libdir@/regress@DLSUFFIX@','FUNC_XW_FIX_DPD' language c IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. -- FUNC_ZERO_NULL DROP FUNCTION IF EXISTS public.FUNC_ZERO_NULL; NOTICE: function public.func_zero_null() does not exist, skipping @@ -229,36 +178,23 @@ CREATE FUNCTION FUNC_ZERO_NULL(in NUMERIC(18,4)) returns NUMERIC(18,4) as '@libdir@/regress@DLSUFFIX@','FUNC_ZERO_NULL' language c strict IMMUTABLE; -ERROR: C/JAVA UDF is not yet supported in current version. DROP FUNCTION IF EXISTS PUBLIC.trunc(int); DROP FUNCTION IF EXISTS PUBLIC.trunc(int, int); -NOTICE: function public.trunc(pg_catalog.int4,pg_catalog.int4) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.trunc(float4, int); -NOTICE: function public.trunc(float4,pg_catalog.int4) does not exist, skipping DROP FUNCTION IF EXISTS public.trunc(numeric, int); DROP FUNCTION IF EXISTS PUBLIC.TransDate(varchar(50), int, varchar(50)); -NOTICE: function public.transdate(pg_catalog.varchar,pg_catalog.int4,pg_catalog.varchar) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.TransTimestamp(varchar(50), int, varchar(50)); -NOTICE: function public.transtimestamp(pg_catalog.varchar,pg_catalog.int4,pg_catalog.varchar) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.sign(float4); -NOTICE: function public.sign(float4) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.sign(int); -NOTICE: function public.sign(pg_catalog.int4) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.rpad(text, numeric, text); -NOTICE: function public.rpad(text,pg_catalog.numeric,text) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.round(int, int); -NOTICE: function public.round(pg_catalog.int4,pg_catalog.int4) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.round(float, int); DROP FUNCTION IF EXISTS PUBLIC.round(numeric, int); DROP FUNCTION IF EXISTS PUBLIC.oreplace; DROP FUNCTION IF EXISTS PUBLIC.NormsDistInner; -NOTICE: function public.normsdistinner() does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.NormsDist; -NOTICE: function public.normsdist() does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.months_between_inner(date, date); -NOTICE: function public.months_between_inner(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.months_between(date, date); -NOTICE: function public.months_between(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.months_between_inner(date, timestamp); NOTICE: function public.months_between_inner(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.months_between(date, timestamp); @@ -272,7 +208,6 @@ NOTICE: function public.months_between_inner(pg_catalog.timestamp,pg_catalog.ti DROP FUNCTION IF EXISTS PUBLIC.months_between(timestamp, timestamp); NOTICE: function public.months_between(pg_catalog.timestamp,pg_catalog.timestamp) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.lpad(text, numeric, text); -NOTICE: function public.lpad(text,pg_catalog.numeric,text) does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.FUNC_JUDGE_ACC; NOTICE: function public.func_judge_acc() does not exist, skipping DROP FUNCTION IF EXISTS PUBLIC.FUNC_GREAST_MOB24; @@ -376,11 +311,8 @@ NOTICE: function public.func_iii_cs0507_2() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_II_GREAST_VAR_MOB12; NOTICE: function public.func_ii_greast_var_mob12() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_III_CS0507_3; -NOTICE: function public.func_iii_cs0507_3() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_III_CS0507; -NOTICE: function public.func_iii_cs0507() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_II_JUDGE_DF_AGE; -NOTICE: function public.func_ii_judge_df_age() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_II_LEAST_CL_MOB6; NOTICE: function public.func_ii_least_cl_mob6() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_II_LEAST_MOB12; @@ -448,10 +380,6 @@ NOTICE: function public.func_sum_mob9() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_SUM_MOB12; NOTICE: function public.func_sum_mob12() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_TRANS_MOBCODE; -NOTICE: function public.func_trans_mobcode() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_TRANS_RISKCODE; -NOTICE: function public.func_trans_riskcode() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_XW_FIX_DPD; -NOTICE: function public.func_xw_fix_dpd() does not exist, skipping DROP FUNCTION IF EXISTS public.FUNC_ZERO_NULL; -NOTICE: function public.func_zero_null() does not exist, skipping diff --git a/third_party/dependency/mysql_fdw/huawei_mysql_fdw-2.5.3_patch.patch b/third_party/dependency/mysql_fdw/huawei_mysql_fdw-2.5.3_patch.patch new file mode 100644 index 0000000000..70fe628c1f --- /dev/null +++ b/third_party/dependency/mysql_fdw/huawei_mysql_fdw-2.5.3_patch.patch @@ -0,0 +1,743 @@ +diff --git a/code/mysql_fdw-REL-2_5_3/Makefile b/code/mysql_fdw-REL-2_5_3/Makefile +index d5e7b36..157a6cf 100644 +--- a/code/mysql_fdw-REL-2_5_3/Makefile ++++ b/code/mysql_fdw-REL-2_5_3/Makefile +@@ -31,6 +31,8 @@ else + MYSQL_LIB = mysqlclient + endif + ++MYSQL_LIB = mariadb ++ + UNAME = uname + OS := $(shell $(UNAME)) + ifeq ($(OS), Darwin) +@@ -39,7 +41,7 @@ else + DLSUFFIX = .so + endif + +-PG_CPPFLAGS += -D _MYSQL_LIBNAME=\"lib$(MYSQL_LIB)$(DLSUFFIX)\" ++PG_CPPFLAGS += -D _MYSQL_LIBNAME=\"lib$(MYSQL_LIB)$(DLSUFFIX)\" -Wno-parentheses + + ifdef USE_PGXS + PG_CONFIG = pg_config +@@ -48,8 +50,8 @@ include $(PGXS) + ifndef MAJORVERSION + MAJORVERSION := $(basename $(VERSION)) + endif +-ifeq (,$(findstring $(MAJORVERSION), 9.3 9.4 9.5 9.6 10 11 12)) +-$(error PostgreSQL 9.3, 9.4, 9.5, 9.6 10 11 12 is required to compile this extension) ++ifeq (,$(findstring $(MAJORVERSION), 9.2 9.3 9.4 9.5 9.6 10 11 12)) ++$(error PostgreSQL 9.2 9.3, 9.4, 9.5, 9.6 10 11 12 is required to compile this extension) + endif + + else +diff --git a/code/mysql_fdw-REL-2_5_3/connection.cpp b/code/mysql_fdw-REL-2_5_3/connection.cpp +index 6b18027..0a9e40f 100644 +--- a/code/mysql_fdw-REL-2_5_3/connection.cpp ++++ b/code/mysql_fdw-REL-2_5_3/connection.cpp +@@ -22,6 +22,7 @@ + #include "utils/hsearch.h" + #include "utils/memutils.h" + #include "utils/resowner.h" ++#include "storage/ipc.h" + + /* Length of host */ + #define HOST_LEN 256 +@@ -48,8 +49,13 @@ typedef struct ConnCacheEntry + /* + * Connection cache (initialized on first use) + */ +-static HTAB *ConnectionHash = NULL; ++static THR_LOCAL HTAB *ConnectionHash = NULL; + ++static void ++mysql_fdw_exit(int code, Datum arg) ++{ ++ mysql_cleanup_connection(); ++} + /* + * mysql_get_connection: + * Get a connection which can be used to execute queries on +@@ -73,10 +79,11 @@ mysql_get_connection(ForeignServer *server, UserMapping *user, mysql_opt *opt) + ctl.hash = tag_hash; + + /* allocate ConnectionHash in the cache context */ +- ctl.hcxt = CacheMemoryContext; ++ ctl.hcxt = u_sess->cache_mem_cxt; + ConnectionHash = hash_create("mysql_fdw connections", 8, + &ctl, + HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT); ++ on_proc_exit(&mysql_fdw_exit, PointerGetDatum(NULL)); + } + + /* Create hash key for the entry. Assume no pad bytes in key struct */ +@@ -86,7 +93,7 @@ mysql_get_connection(ForeignServer *server, UserMapping *user, mysql_opt *opt) + /* + * Find or create cached entry for requested connection. + */ +- entry = hash_search(ConnectionHash, &key, HASH_ENTER, &found); ++ entry = (ConnCacheEntry*)hash_search(ConnectionHash, &key, HASH_ENTER, &found); + if (!found) + { + /* initialize new hashtable entry (key is already filled in) */ +@@ -137,6 +144,9 @@ mysql_cleanup_connection(void) + _mysql_close(entry->conn); + entry->conn = NULL; + } ++ /* clean-up memory */ ++ hash_destroy(ConnectionHash); ++ ConnectionHash = NULL; + } + + /* +diff --git a/code/mysql_fdw-REL-2_5_3/deparse.cpp b/code/mysql_fdw-REL-2_5_3/deparse.cpp +index a75c270..94b1799 100644 +--- a/code/mysql_fdw-REL-2_5_3/deparse.cpp ++++ b/code/mysql_fdw-REL-2_5_3/deparse.cpp +@@ -20,7 +20,7 @@ + #include "pgtime.h" + + #include "access/heapam.h" +-#include "access/htup_details.h" ++#include "access/htup.h" + #include "access/sysattr.h" + #include "access/transam.h" + #include "catalog/pg_collation.h" +@@ -169,7 +169,7 @@ mysql_deparse_relation(StringInfo buf, Relation rel) + static char * + mysql_quote_identifier(const char *s , char q) + { +- char *result = palloc(strlen(s) * 2 + 3); ++ char *result = (char*)palloc(strlen(s) * 2 + 3); + char *r = result; + + *r++ = q; +@@ -451,7 +451,7 @@ mysql_deparse_string(StringInfo buf, const char *val, bool isstr) + * Remove '{', '}' and \" character from the string. Because + * this syntax is not recognize by the remote MySQL server. + */ +- if ((ch == '{' && i == 0) || (ch == '}' && (i == (strlen(val) - 1))) || ch == '\"') ++ if ((ch == '{' && i == 0) || (ch == '}' && ((unsigned int)i == (strlen(val) - 1))) || ch == '\"') + continue; + + if (ch == ',' && isstr) +@@ -869,11 +869,11 @@ mysql_deparse_array_ref(SubscriptingRef *node, deparse_expr_cxt *context) + appendStringInfoChar(buf, '['); + if (lowlist_item) + { +- deparseExpr(lfirst(lowlist_item), context); ++ deparseExpr((Expr*)lfirst(lowlist_item), context); + appendStringInfoChar(buf, ':'); + lowlist_item = lnext(lowlist_item); + } +- deparseExpr(lfirst(uplist_item), context); ++ deparseExpr((Expr*)lfirst(uplist_item), context); + appendStringInfoChar(buf, ']'); + } + +@@ -965,7 +965,7 @@ mysql_deparse_op_expr(OpExpr *node, deparse_expr_cxt *context) + if (oprkind == 'r' || oprkind == 'b') + { + arg = list_head(node->args); +- deparseExpr(lfirst(arg), context); ++ deparseExpr((Expr*)lfirst(arg), context); + appendStringInfoChar(buf, ' '); + } + +@@ -977,7 +977,7 @@ mysql_deparse_op_expr(OpExpr *node, deparse_expr_cxt *context) + { + arg = list_tail(node->args); + appendStringInfoChar(buf, ' '); +- deparseExpr(lfirst(arg), context); ++ deparseExpr((Expr*)lfirst(arg), context); + } + + appendStringInfoChar(buf, ')'); +@@ -1056,9 +1056,9 @@ mysql_deparse_distinct_expr(DistinctExpr *node, deparse_expr_cxt *context) + Assert(list_length(node->args) == 2); + + appendStringInfoChar(buf, '('); +- deparseExpr(linitial(node->args), context); ++ deparseExpr((Expr*)linitial(node->args), context); + appendStringInfoString(buf, " IS DISTINCT FROM "); +- deparseExpr(lsecond(node->args), context); ++ deparseExpr((Expr*)lsecond(node->args), context); + appendStringInfoChar(buf, ')'); + } + +@@ -1089,7 +1089,7 @@ mysql_deparse_scalar_array_op_expr(ScalarArrayOpExpr *node, deparse_expr_cxt *co + Assert(list_length(node->args) == 2); + + /* Deparse left operand. */ +- arg1 = linitial(node->args); ++ arg1 = (Expr*)linitial(node->args); + deparseExpr(arg1, context); + appendStringInfoChar(buf, ' '); + +@@ -1101,7 +1101,7 @@ mysql_deparse_scalar_array_op_expr(ScalarArrayOpExpr *node, deparse_expr_cxt *co + appendStringInfo(buf, " IN ("); + + /* Deparse right operand. */ +- arg2 = lsecond(node->args); ++ arg2 = (Expr*)lsecond(node->args); + switch (nodeTag((Node*)arg2)) + { + case T_Const: +@@ -1116,7 +1116,7 @@ mysql_deparse_scalar_array_op_expr(ScalarArrayOpExpr *node, deparse_expr_cxt *co + switch (c->consttype) + { + case INT4ARRAYOID: +- case OIDARRAYOID: ++ // case OIDARRAYOID: + mysql_deparse_string(buf, extval, false); + break; + default: +@@ -1172,7 +1172,7 @@ mysql_deparse_bool_expr(BoolExpr *node, deparse_expr_cxt *context) + break; + case NOT_EXPR: + appendStringInfoString(buf, "(NOT "); +- deparseExpr(linitial(node->args), context); ++ deparseExpr((Expr*)linitial(node->args), context); + appendStringInfoChar(buf, ')'); + return; + } +@@ -1220,7 +1220,7 @@ mysql_deparse_array_expr(ArrayExpr *node, deparse_expr_cxt *context) + { + if (!first) + appendStringInfoString(buf, ", "); +- deparseExpr(lfirst(lc), context); ++ deparseExpr((Expr*)lfirst(lc), context); + first = false; + } + appendStringInfoChar(buf, ']'); +diff --git a/code/mysql_fdw-REL-2_5_3/mysql_fdw.cpp b/code/mysql_fdw-REL-2_5_3/mysql_fdw.cpp +index f1e26c3..49243d1 100644 +--- a/code/mysql_fdw-REL-2_5_3/mysql_fdw.cpp ++++ b/code/mysql_fdw-REL-2_5_3/mysql_fdw.cpp +@@ -53,7 +53,7 @@ + #include "utils/timestamp.h" + #include "utils/formatting.h" + #include "utils/memutils.h" +-#include "access/htup_details.h" ++#include "access/htup.h" + #include "access/sysattr.h" + #include "commands/defrem.h" + #include "commands/explain.h" +@@ -108,15 +108,57 @@ typedef struct MySQLFdwRelationInfo + } MySQLFdwRelationInfo; + + +-extern Datum mysql_fdw_handler(PG_FUNCTION_ARGS); ++extern "C" Datum mysql_fdw_handler(PG_FUNCTION_ARGS); ++extern "C" Datum mysql_fdw_version(PG_FUNCTION_ARGS); + extern PGDLLEXPORT void _PG_init(void); + + bool mysql_load_library(void); +-static void mysql_fdw_exit(int code, Datum arg); + + PG_FUNCTION_INFO_V1(mysql_fdw_handler); + PG_FUNCTION_INFO_V1(mysql_fdw_version); + ++int ((*_mysql_options)(MYSQL *mysql,enum mysql_option option, const void *arg)); ++int ((*_mysql_stmt_execute)(MYSQL_STMT *stmt)); ++int ((*_mysql_stmt_fetch)(MYSQL_STMT *stmt)); ++int ((*_mysql_stmt_prepare)(MYSQL_STMT *stmt, const char *query, unsigned long length)); ++int ((*_mysql_query)(MYSQL *mysql, const char *q)); ++bool ((*_mysql_stmt_attr_set)(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, const void *attr)); ++bool ((*_mysql_stmt_close)(MYSQL_STMT * stmt)); ++bool ((*_mysql_stmt_reset)(MYSQL_STMT * stmt)); ++bool ((*_mysql_free_result)(MYSQL_RES *result)); ++bool ((*_mysql_stmt_bind_param)(MYSQL_STMT *stmt, MYSQL_BIND * bnd)); ++bool ((*_mysql_stmt_bind_result)(MYSQL_STMT *stmt, MYSQL_BIND * bnd)); ++ ++MYSQL_STMT *((*_mysql_stmt_init)(MYSQL *mysql)); ++MYSQL_RES *((*_mysql_stmt_result_metadata)(MYSQL_STMT *stmt)); ++int ((*_mysql_stmt_store_result)(MYSQL *mysql)); ++MYSQL_ROW ((*_mysql_fetch_row)(MYSQL_RES *result)); ++MYSQL_FIELD *((*_mysql_fetch_field)(MYSQL_RES *result)); ++MYSQL_FIELD *((*_mysql_fetch_fields)(MYSQL_RES *result)); ++const char *((*_mysql_error)(MYSQL *mysql)); ++void ((*_mysql_close)(MYSQL *sock)); ++MYSQL_RES* ((*_mysql_store_result)(MYSQL *mysql)); ++ ++MYSQL *((*_mysql_init)(MYSQL *mysql)); ++bool ((*_mysql_ssl_set)(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher)); ++MYSQL *((*_mysql_real_connect)(MYSQL *mysql, ++ const char *host, ++ const char *user, ++ const char *passwd, ++ const char *db, ++ unsigned int port, ++ const char *unix_socket, ++ unsigned long clientflag)); ++ ++const char *((*_mysql_get_host_info)(MYSQL *mysql)); ++const char *((*_mysql_get_server_info)(MYSQL *mysql)); ++int ((*_mysql_get_proto_info)(MYSQL *mysql)); ++ ++unsigned int ((*_mysql_stmt_errno)(MYSQL_STMT *stmt)); ++unsigned int ((*_mysql_errno)(MYSQL *mysql)); ++unsigned int ((*_mysql_num_fields)(MYSQL_RES *result)); ++unsigned int ((*_mysql_num_rows)(MYSQL_RES *result)); ++ + /* + * FDW callback routines + */ +@@ -219,36 +261,36 @@ mysql_load_library(void) + if(mysql_dll_handle == NULL) + return false; + +- _mysql_stmt_bind_param = dlsym(mysql_dll_handle, "mysql_stmt_bind_param"); +- _mysql_stmt_bind_result = dlsym(mysql_dll_handle, "mysql_stmt_bind_result"); +- _mysql_stmt_init = dlsym(mysql_dll_handle, "mysql_stmt_init"); +- _mysql_stmt_prepare = dlsym(mysql_dll_handle, "mysql_stmt_prepare"); +- _mysql_stmt_execute = dlsym(mysql_dll_handle, "mysql_stmt_execute"); +- _mysql_stmt_fetch = dlsym(mysql_dll_handle, "mysql_stmt_fetch"); +- _mysql_query = dlsym(mysql_dll_handle, "mysql_query"); +- _mysql_stmt_result_metadata = dlsym(mysql_dll_handle, "mysql_stmt_result_metadata"); +- _mysql_stmt_store_result = dlsym(mysql_dll_handle, "mysql_stmt_store_result"); +- _mysql_fetch_row = dlsym(mysql_dll_handle, "mysql_fetch_row"); +- _mysql_fetch_field = dlsym(mysql_dll_handle, "mysql_fetch_field"); +- _mysql_fetch_fields = dlsym(mysql_dll_handle, "mysql_fetch_fields"); +- _mysql_stmt_close = dlsym(mysql_dll_handle, "mysql_stmt_close"); +- _mysql_stmt_reset = dlsym(mysql_dll_handle, "mysql_stmt_reset"); +- _mysql_free_result = dlsym(mysql_dll_handle, "mysql_free_result"); +- _mysql_error = dlsym(mysql_dll_handle, "mysql_error"); +- _mysql_options = dlsym(mysql_dll_handle, "mysql_options"); +- _mysql_ssl_set = dlsym(mysql_dll_handle, "mysql_ssl_set"); +- _mysql_real_connect = dlsym(mysql_dll_handle, "mysql_real_connect"); +- _mysql_close = dlsym(mysql_dll_handle, "mysql_close"); +- _mysql_init = dlsym(mysql_dll_handle, "mysql_init"); +- _mysql_stmt_attr_set = dlsym(mysql_dll_handle, "mysql_stmt_attr_set"); +- _mysql_store_result = dlsym(mysql_dll_handle, "mysql_store_result"); +- _mysql_stmt_errno = dlsym(mysql_dll_handle, "mysql_stmt_errno"); +- _mysql_errno = dlsym(mysql_dll_handle, "mysql_errno"); +- _mysql_num_fields = dlsym(mysql_dll_handle, "mysql_num_fields"); +- _mysql_num_rows = dlsym(mysql_dll_handle, "mysql_num_rows"); +- _mysql_get_host_info = dlsym(mysql_dll_handle, "mysql_get_host_info"); +- _mysql_get_server_info = dlsym(mysql_dll_handle, "mysql_get_server_info"); +- _mysql_get_proto_info = dlsym(mysql_dll_handle, "mysql_get_proto_info"); ++ _mysql_stmt_bind_param = (bool (*)(st_mysql_stmt*, st_mysql_bind*))dlsym(mysql_dll_handle, "mysql_stmt_bind_param"); ++ _mysql_stmt_bind_result = (bool (*)(st_mysql_stmt*, st_mysql_bind*))dlsym(mysql_dll_handle, "mysql_stmt_bind_result"); ++ _mysql_stmt_init = (st_mysql_stmt* (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_stmt_init"); ++ _mysql_stmt_prepare = (int (*)(st_mysql_stmt*, const char*, long unsigned int))dlsym(mysql_dll_handle, "mysql_stmt_prepare"); ++ _mysql_stmt_execute = (int (*)(st_mysql_stmt*))dlsym(mysql_dll_handle, "mysql_stmt_execute"); ++ _mysql_stmt_fetch = (int (*)(st_mysql_stmt*))dlsym(mysql_dll_handle, "mysql_stmt_fetch"); ++ _mysql_query = (int (*)(st_mysql*, const char*))dlsym(mysql_dll_handle, "mysql_query"); ++ _mysql_stmt_result_metadata = (st_mysql_res* (*)(st_mysql_stmt*))dlsym(mysql_dll_handle, "mysql_stmt_result_metadata"); ++ _mysql_stmt_store_result = (int (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_stmt_store_result"); ++ _mysql_fetch_row = (char** (*)(st_mysql_res*))dlsym(mysql_dll_handle, "mysql_fetch_row"); ++ _mysql_fetch_field = (st_mysql_field* (*)(st_mysql_res*))dlsym(mysql_dll_handle, "mysql_fetch_field"); ++ _mysql_fetch_fields = (st_mysql_field* (*)(st_mysql_res*))dlsym(mysql_dll_handle, "mysql_fetch_fields"); ++ _mysql_stmt_close = (bool (*)(st_mysql_stmt*))dlsym(mysql_dll_handle, "mysql_stmt_close"); ++ _mysql_stmt_reset = (bool (*)(st_mysql_stmt*))dlsym(mysql_dll_handle, "mysql_stmt_reset"); ++ _mysql_free_result = (bool (*)(st_mysql_res*))dlsym(mysql_dll_handle, "mysql_free_result"); ++ _mysql_error = (const char* (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_error"); ++ _mysql_options = (int (*)(st_mysql*, mysql_option, const void*))dlsym(mysql_dll_handle, "mysql_options"); ++ _mysql_ssl_set = (bool (*)(st_mysql*, const char*, const char*, const char*, const char*, const char*))dlsym(mysql_dll_handle, "mysql_ssl_set"); ++ _mysql_real_connect = (st_mysql* (*)(st_mysql*, const char*, const char*, const char*, const char*, unsigned int, const char*, long unsigned int))dlsym(mysql_dll_handle, "mysql_real_connect"); ++ _mysql_close = (void (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_close"); ++ _mysql_init = (st_mysql* (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_init"); ++ _mysql_stmt_attr_set = (bool (*)(st_mysql_stmt*, enum_stmt_attr_type, const void*))dlsym(mysql_dll_handle, "mysql_stmt_attr_set"); ++ _mysql_store_result = (st_mysql_res* (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_store_result"); ++ _mysql_stmt_errno = (unsigned int (*)(st_mysql_stmt*))dlsym(mysql_dll_handle, "mysql_stmt_errno"); ++ _mysql_errno = (unsigned int (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_errno"); ++ _mysql_num_fields = (unsigned int (*)(st_mysql_res*))dlsym(mysql_dll_handle, "mysql_num_fields"); ++ _mysql_num_rows = (unsigned int (*)(st_mysql_res*))dlsym(mysql_dll_handle, "mysql_num_rows"); ++ _mysql_get_host_info = (const char* (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_get_host_info"); ++ _mysql_get_server_info = (const char* (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_get_server_info"); ++ _mysql_get_proto_info = (int (*)(st_mysql*))dlsym(mysql_dll_handle, "mysql_get_proto_info"); + + if (_mysql_stmt_bind_param == NULL || + _mysql_stmt_bind_result == NULL || +@@ -297,43 +339,37 @@ _PG_init(void) + errmsg("failed to load the mysql query: \n%s", dlerror()), + errhint("export LD_LIBRARY_PATH to locate the library"))); + +- DefineCustomIntVariable("mysql_fdw.wait_timeout", +- "Server-side wait_timeout", +- "Set the maximum wait_timeout" +- "use to set the MySQL session timeout", +- &wait_timeout, +- WAIT_TIMEOUT, +- 0, +- INT_MAX, +- PGC_USERSET, +- 0, +- NULL, +- NULL, +- NULL); +- +- DefineCustomIntVariable("mysql_fdw.interactive_timeout", +- "Server-side interactive timeout", +- "Set the maximum interactive timeout" +- "use to set the MySQL session timeout", +- &interactive_timeout, +- INTERACTIVE_TIMEOUT, +- 0, +- INT_MAX, +- PGC_USERSET, +- 0, +- NULL, +- NULL, +- NULL); +- on_proc_exit(&mysql_fdw_exit, PointerGetDatum(NULL)); +-} ++ if (GetConfigOption("mysql_fdw.wait_timeout", true, true) == NULL) { ++ DefineCustomIntVariable("mysql_fdw.wait_timeout", ++ "Server-side wait_timeout", ++ "Set the maximum wait_timeout" ++ "use to set the MySQL session timeout", ++ &wait_timeout, ++ WAIT_TIMEOUT, ++ 0, ++ INT_MAX, ++ PGC_USERSET, ++ 0, ++ NULL, ++ NULL, ++ NULL); ++ } + +-/* +- * mysql_fdw_exit: Exit callback function. +- */ +-static void +-mysql_fdw_exit(int code, Datum arg) +-{ +- mysql_cleanup_connection(); ++ if (GetConfigOption("mysql_fdw.interactive_timeout", true, true) == NULL) { ++ DefineCustomIntVariable("mysql_fdw.interactive_timeout", ++ "Server-side interactive timeout", ++ "Set the maximum interactive timeout" ++ "use to set the MySQL session timeout", ++ &interactive_timeout, ++ INTERACTIVE_TIMEOUT, ++ 0, ++ INT_MAX, ++ PGC_USERSET, ++ 0, ++ NULL, ++ NULL, ++ NULL); ++ } + } + + /* +@@ -348,7 +384,7 @@ mysql_fdw_handler(PG_FUNCTION_ARGS) + /* Callback functions for readable FDW */ + fdwroutine->GetForeignRelSize = mysqlGetForeignRelSize; + fdwroutine->GetForeignPaths = mysqlGetForeignPaths; +- fdwroutine->AnalyzeForeignTable = mysqlAnalyzeForeignTable; ++ fdwroutine->AnalyzeForeignTable = (bool (*)(Relation relation, AcquireSampleRowsFunc* func, BlockNumber* totalpages, void* additionalData, bool estimate_table_rownum))mysqlAnalyzeForeignTable; + fdwroutine->GetForeignPlan = mysqlGetForeignPlan; + fdwroutine->ExplainForeignScan = mysqlExplainForeignScan; + fdwroutine->BeginForeignScan = mysqlBeginForeignScan; +@@ -427,7 +463,7 @@ mysqlBeginForeignScan(ForeignScanState *node, int eflags) + + /* Stash away the state info we have already */ + festate->query = strVal(list_nth(fsplan->fdw_private, 0)); +- festate->retrieved_attrs = list_nth(fsplan->fdw_private, 1); ++ festate->retrieved_attrs = (List*)list_nth(fsplan->fdw_private, 1); + festate->conn = conn; + festate->cursor_exists = false; + +@@ -1047,12 +1083,12 @@ mysqlGetForeignPaths(PlannerInfo *root,RelOptInfo *baserel,Oid foreigntableid) + mysqlEstimateCosts(root, baserel, &startup_cost, &total_cost, foreigntableid); + + /* Create a ForeignPath node and add it as only possible path */ +- add_path(baserel, (Path *) ++ add_path(root, baserel, (Path *) + create_foreignscan_path(root, baserel, + #if PG_VERSION_NUM >= 90600 + NULL, /* default pathtarget */ +-#endif + baserel->rows, ++#endif + startup_cost, + total_cost, + NIL, /* no pathkeys */ +@@ -1155,7 +1191,7 @@ mysqlGetForeignPlan( + mysql_append_where_clause(&sql, root, baserel, remote_conds, + true, ¶ms_list); + +- if (baserel->relid == root->parse->resultRelation && ++ if (baserel->relid == (unsigned int)root->parse->resultRelation && + (root->parse->commandType == CMD_UPDATE || + root->parse->commandType == CMD_DELETE)) + { +@@ -1319,7 +1355,7 @@ mysqlPlanForeignModify(PlannerInfo *root, + #if PG_VERSION_NUM >= 90500 + Bitmapset *tmpset = bms_copy(rte->updatedCols); + #else +- Bitmapset *tmpset = bms_copy(rte->modifiedCols); ++ Bitmapset *tmpset = bms_copy(rte->updatedCols); + #endif + AttrNumber col; + +@@ -1633,7 +1669,7 @@ mysqlExecForeignUpdate(EState *estate, + n_params = list_length(fmstate->retrieved_attrs); + + mysql_bind_buffer = (MYSQL_BIND*) palloc0(sizeof(MYSQL_BIND) * n_params); +- isnull = palloc0(sizeof(bool) * n_params); ++ isnull = (bool*)palloc0(sizeof(bool) * n_params); + + /* Bind the values */ + foreach(lc, fmstate->retrieved_attrs) +@@ -1822,7 +1858,7 @@ mysqlExecForeignDelete(EState *estate, + static void + mysqlEndForeignModify(EState *estate, ResultRelInfo *resultRelInfo) + { +- MySQLFdwExecState *festate = resultRelInfo->ri_FdwState; ++ MySQLFdwExecState *festate = (MySQLFdwExecState*)resultRelInfo->ri_FdwState; + + if (festate && festate->stmt) + { +diff --git a/code/mysql_fdw-REL-2_5_3/mysql_fdw.h b/code/mysql_fdw-REL-2_5_3/mysql_fdw.h +index 5b543cd..b2a7011 100644 +--- a/code/mysql_fdw-REL-2_5_3/mysql_fdw.h ++++ b/code/mysql_fdw-REL-2_5_3/mysql_fdw.h +@@ -135,31 +135,31 @@ extern bool is_foreign_expr(PlannerInfo *root, + Expr *expr); + + +-int ((*_mysql_options)(MYSQL *mysql,enum mysql_option option, const void *arg)); +-int ((*_mysql_stmt_prepare)(MYSQL_STMT *stmt, const char *query, unsigned long length)); +-int ((*_mysql_stmt_execute)(MYSQL_STMT *stmt)); +-int ((*_mysql_stmt_fetch)(MYSQL_STMT *stmt)); +-int ((*_mysql_query)(MYSQL *mysql, const char *q)); +-bool ((*_mysql_stmt_attr_set)(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, const void *attr)); +-bool ((*_mysql_stmt_close)(MYSQL_STMT * stmt)); +-bool ((*_mysql_stmt_reset)(MYSQL_STMT * stmt)); +-bool ((*_mysql_free_result)(MYSQL_RES *result)); +-bool ((*_mysql_stmt_bind_param)(MYSQL_STMT *stmt, MYSQL_BIND * bnd)); +-bool ((*_mysql_stmt_bind_result)(MYSQL_STMT *stmt, MYSQL_BIND * bnd)); +- +-MYSQL_STMT *((*_mysql_stmt_init)(MYSQL *mysql)); +-MYSQL_RES *((*_mysql_stmt_result_metadata)(MYSQL_STMT *stmt)); +-int ((*_mysql_stmt_store_result)(MYSQL *mysql)); +-MYSQL_ROW ((*_mysql_fetch_row)(MYSQL_RES *result)); +-MYSQL_FIELD *((*_mysql_fetch_field)(MYSQL_RES *result)); +-MYSQL_FIELD *((*_mysql_fetch_fields)(MYSQL_RES *result)); +-const char *((*_mysql_error)(MYSQL *mysql)); +-void ((*_mysql_close)(MYSQL *sock)); +-MYSQL_RES* ((*_mysql_store_result)(MYSQL *mysql)); +- +-MYSQL *((*_mysql_init)(MYSQL *mysql)); +-bool ((*_mysql_ssl_set)(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher)); +-MYSQL *((*_mysql_real_connect)(MYSQL *mysql, ++extern int ((*_mysql_options)(MYSQL *mysql,enum mysql_option option, const void *arg)); ++extern int ((*_mysql_stmt_execute)(MYSQL_STMT *stmt)); ++extern int ((*_mysql_stmt_fetch)(MYSQL_STMT *stmt)); ++extern int ((*_mysql_stmt_prepare)(MYSQL_STMT *stmt, const char *query, unsigned long length)); ++extern int ((*_mysql_query)(MYSQL *mysql, const char *q)); ++extern bool ((*_mysql_stmt_attr_set)(MYSQL_STMT *stmt, enum enum_stmt_attr_type attr_type, const void *attr)); ++extern bool ((*_mysql_stmt_close)(MYSQL_STMT * stmt)); ++extern bool ((*_mysql_stmt_reset)(MYSQL_STMT * stmt)); ++extern bool ((*_mysql_free_result)(MYSQL_RES *result)); ++extern bool ((*_mysql_stmt_bind_param)(MYSQL_STMT *stmt, MYSQL_BIND * bnd)); ++extern bool ((*_mysql_stmt_bind_result)(MYSQL_STMT *stmt, MYSQL_BIND * bnd)); ++ ++extern MYSQL_STMT *((*_mysql_stmt_init)(MYSQL *mysql)); ++extern MYSQL_RES *((*_mysql_stmt_result_metadata)(MYSQL_STMT *stmt)); ++extern int ((*_mysql_stmt_store_result)(MYSQL *mysql)); ++extern MYSQL_ROW ((*_mysql_fetch_row)(MYSQL_RES *result)); ++extern MYSQL_FIELD *((*_mysql_fetch_field)(MYSQL_RES *result)); ++extern MYSQL_FIELD *((*_mysql_fetch_fields)(MYSQL_RES *result)); ++extern const char *((*_mysql_error)(MYSQL *mysql)); ++extern void ((*_mysql_close)(MYSQL *sock)); ++extern MYSQL_RES* ((*_mysql_store_result)(MYSQL *mysql)); ++ ++extern MYSQL *((*_mysql_init)(MYSQL *mysql)); ++extern bool ((*_mysql_ssl_set)(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher)); ++extern MYSQL *((*_mysql_real_connect)(MYSQL *mysql, + const char *host, + const char *user, + const char *passwd, +@@ -168,14 +168,14 @@ MYSQL *((*_mysql_real_connect)(MYSQL *mysql, + const char *unix_socket, + unsigned long clientflag)); + +-const char *((*_mysql_get_host_info)(MYSQL *mysql)); +-const char *((*_mysql_get_server_info)(MYSQL *mysql)); +-int ((*_mysql_get_proto_info)(MYSQL *mysql)); ++extern const char *((*_mysql_get_host_info)(MYSQL *mysql)); ++extern const char *((*_mysql_get_server_info)(MYSQL *mysql)); ++extern int ((*_mysql_get_proto_info)(MYSQL *mysql)); + +-unsigned int ((*_mysql_stmt_errno)(MYSQL_STMT *stmt)); +-unsigned int ((*_mysql_errno)(MYSQL *mysql)); +-unsigned int ((*_mysql_num_fields)(MYSQL_RES *result)); +-unsigned int ((*_mysql_num_rows)(MYSQL_RES *result)); ++extern unsigned int ((*_mysql_stmt_errno)(MYSQL_STMT *stmt)); ++extern unsigned int ((*_mysql_errno)(MYSQL *mysql)); ++extern unsigned int ((*_mysql_num_fields)(MYSQL_RES *result)); ++extern unsigned int ((*_mysql_num_rows)(MYSQL_RES *result)); + + + /* option.c headers */ +diff --git a/code/mysql_fdw-REL-2_5_3/mysql_query.cpp b/code/mysql_fdw-REL-2_5_3/mysql_query.cpp +index 8c25f5c..6093a5a 100644 +--- a/code/mysql_fdw-REL-2_5_3/mysql_query.cpp ++++ b/code/mysql_fdw-REL-2_5_3/mysql_query.cpp +@@ -21,7 +21,7 @@ + #include + + #include +-#include ++#include + + #include "access/reloptions.h" + #include "catalog/pg_type.h" +@@ -48,7 +48,7 @@ + #include "utils/timestamp.h" + #include "utils/formatting.h" + #include "utils/memutils.h" +-#include "access/htup_details.h" ++#include "access/htup.h" + #include "access/sysattr.h" + #include "commands/defrem.h" + #include "commands/explain.h" +@@ -226,6 +226,7 @@ mysql_from_pgtyp(Oid type) + break; + } + } ++ return MAX_NO_FIELD_TYPES; + } + + /* +@@ -238,8 +239,8 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + /* Clear the bind buffer and attributes */ + memset(&binds[attnum], 0x0, sizeof(MYSQL_BIND)); + +- binds[attnum].buffer_type = mysql_from_pgtyp(type); +- binds[attnum].is_null = isnull; ++ binds[attnum].buffer_type = (enum_field_types)mysql_from_pgtyp(type); ++ binds[attnum].is_null = (my_bool*)isnull; + + /* Avoid to bind buffer in case value is NULL */ + if (*isnull) +@@ -250,7 +251,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + case INT2OID: + { + int16 dat = DatumGetInt16(value); +- int16 *bufptr = palloc0(sizeof(int16)); ++ int16 *bufptr = (int16*)palloc0(sizeof(int16)); + memcpy(bufptr, (char*)&dat, sizeof(int16)); + + binds[attnum].buffer = bufptr; +@@ -259,7 +260,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + case INT4OID: + { + int32 dat = DatumGetInt32(value); +- int32 *bufptr = palloc0(sizeof(int32)); ++ int32 *bufptr = (int32*)palloc0(sizeof(int32)); + memcpy(bufptr, (char*)&dat, sizeof(int32)); + + binds[attnum].buffer = bufptr; +@@ -268,7 +269,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + case INT8OID: + { + int64 dat = DatumGetInt64(value); +- int64 *bufptr = palloc0(sizeof(int64)); ++ int64 *bufptr = (int64*)palloc0(sizeof(int64)); + memcpy(bufptr, (char*)&dat, sizeof(int64)); + + binds[attnum].buffer = bufptr; +@@ -277,7 +278,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + case FLOAT4OID: + { + float4 dat = DatumGetFloat4(value); +- float4 *bufptr = palloc0(sizeof(float4)); ++ float4 *bufptr = (float4*)palloc0(sizeof(float4)); + memcpy(bufptr, (char*)&dat, sizeof(float4)); + + binds[attnum].buffer = bufptr; +@@ -286,7 +287,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + case FLOAT8OID: + { + float8 dat = DatumGetFloat8(value); +- float8 *bufptr = palloc0(sizeof(float8)); ++ float8 *bufptr = (float8*)palloc0(sizeof(float8)); + memcpy(bufptr, (char*)&dat, sizeof(float8)); + + binds[attnum].buffer = bufptr; +@@ -296,7 +297,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + { + Datum valueDatum = DirectFunctionCall1(numeric_float8, value); + float8 dat = DatumGetFloat8(valueDatum); +- float8 *bufptr = palloc0(sizeof(float8)); ++ float8 *bufptr = (float8*)palloc0(sizeof(float8)); + memcpy(bufptr, (char*)&dat, sizeof(float8)); + + binds[attnum].buffer = bufptr; +@@ -305,7 +306,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + case BOOLOID: + { + int32 dat = DatumGetInt32(value); +- int32 *bufptr = palloc0(sizeof(int32)); ++ int32 *bufptr = (int32*)palloc0(sizeof(int32)); + memcpy(bufptr, (char*)&dat, sizeof(int32)); + + binds[attnum].buffer = bufptr; +@@ -348,7 +349,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + + Datum valueDatum = DirectFunctionCall1(date_timestamp, value); + Timestamp valueTimestamp = DatumGetTimestamp(valueDatum); +- MYSQL_TIME* ts = palloc0(sizeof(MYSQL_TIME)); ++ MYSQL_TIME* ts = (MYSQL_TIME*)palloc0(sizeof(MYSQL_TIME)); + + timestamp2tm(valueTimestamp, &tz, tm, &fsec, &tzn, pg_tzset("UTC")); + +@@ -364,7 +365,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + case TIMESTAMPTZOID: + { + Timestamp valueTimestamp = DatumGetTimestamp(value); +- MYSQL_TIME* ts = palloc0(sizeof(MYSQL_TIME)); ++ MYSQL_TIME* ts = (MYSQL_TIME*)palloc0(sizeof(MYSQL_TIME)); + + int tz; + struct pg_tm tt, +@@ -384,7 +385,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + case BITOID: + { + int32 dat; +- int32 *bufptr = palloc0(sizeof(int32)); ++ int32 *bufptr = (int32*)palloc0(sizeof(int32)); + char *outputString = NULL; + Oid outputFunctionId = InvalidOid; + bool typeVarLength = false; +@@ -412,7 +413,7 @@ mysql_bind_sql_var(Oid type, int attnum, Datum value, MYSQL_BIND *binds, bool *i + len = VARSIZE_4B(result) - VARHDRSZ; + dat = VARDATA_4B(result); + } +- bufptr = palloc0(len); ++ bufptr = (char*)palloc0(len); + memcpy(bufptr, (char*)dat, len); + binds[attnum].buffer = bufptr; + binds[attnum].buffer_length = len; +@@ -438,9 +439,9 @@ void + mysql_bind_result(Oid pgtyp, int pgtypmod, MYSQL_FIELD *field, mysql_column *column) + { + MYSQL_BIND *mbind = column->_mysql_bind; +- mbind->is_null = &column->is_null; ++ mbind->is_null = (my_bool*)&column->is_null; + mbind->length = &column->length; +- mbind->error = &column->error; ++ mbind->error = (my_bool*)&column->error; + + switch (pgtyp) + { +diff --git a/code/mysql_fdw-REL-2_5_3/option.cpp b/code/mysql_fdw-REL-2_5_3/option.cpp +index 880d984..f3b77f7 100644 +--- a/code/mysql_fdw-REL-2_5_3/option.cpp ++++ b/code/mysql_fdw-REL-2_5_3/option.cpp +@@ -81,7 +81,7 @@ static struct MySQLFdwOption valid_options[] = + { NULL, InvalidOid } + }; + +-extern Datum mysql_fdw_validator(PG_FUNCTION_ARGS); ++extern "C" Datum mysql_fdw_validator(PG_FUNCTION_ARGS); + + PG_FUNCTION_INFO_V1(mysql_fdw_validator); + diff --git a/third_party/dependency/mysql_fdw/mysql_fdw-REL-2_5_3.tar.gz b/third_party/dependency/mysql_fdw/mysql_fdw-REL-2_5_3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1409e687d71cdc2991b89de757ba8d3e21be83ae GIT binary patch literal 42804 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 t-xblKI|*ZsfG@EiN>2F9!13