Files
openGauss-server/third_party/dependency/mysql_fdw/huawei_mysql_fdw-2.5.3_patch.patch
2020-08-06 20:14:04 +08:00

812 lines
32 KiB
Diff

diff --git Makefile Makefile
index d5e7b362..34667e12 100644
--- Makefile
+++ 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,14 +50,15 @@ 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
-subdir = contrib/mysql_fdw
-top_builddir = ../..
+top_builddir = ../../../../../
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
+exclude_option=-fPIE
+override CPPFLAGS := $(filter-out $(exclude_option),$(CPPFLAGS))
endif
diff --git connection.cpp connection.cpp
index a517a738..51554000 100644
--- connection.cpp
+++ connection.cpp
@@ -24,6 +24,7 @@
#include "utils/memutils.h"
#include "utils/resowner.h"
#include "utils/syscache.h"
+#include "storage/ipc.h"
/* Length of host */
#define HOST_LEN 256
@@ -50,10 +51,11 @@ typedef struct ConnCacheEntry
uint32 mapping_hashvalue; /* hash value of user mapping OID */
} ConnCacheEntry;
-/*
- * Connection cache (initialized on first use)
- */
-static HTAB *ConnectionHash = NULL;
+static void
+mysql_fdw_exit(int code, Datum arg)
+{
+ mysql_cleanup_connection();
+}
static void mysql_inval_callback(Datum arg, int cacheid, uint32 hashvalue);
@@ -71,7 +73,7 @@ mysql_get_connection(ForeignServer *server, UserMapping *user, mysql_opt *opt)
ConnCacheKey key;
/* First time through, initialize connection cache hashtable */
- if (ConnectionHash == NULL)
+ if (u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList == NULL)
{
HASHCTL ctl;
MemSet(&ctl, 0, sizeof(ctl));
@@ -80,8 +82,8 @@ mysql_get_connection(ForeignServer *server, UserMapping *user, mysql_opt *opt)
ctl.hash = tag_hash;
/* allocate ConnectionHash in the cache context */
- ctl.hcxt = CacheMemoryContext;
- ConnectionHash = hash_create("mysql_fdw connections", 8,
+ ctl.hcxt = u_sess->cache_mem_cxt;
+ u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList = hash_create("mysql_fdw connections", 8,
&ctl,
HASH_ELEM | HASH_FUNCTION | HASH_CONTEXT);
@@ -93,6 +95,14 @@ mysql_get_connection(ForeignServer *server, UserMapping *user, mysql_opt *opt)
mysql_inval_callback, (Datum) 0);
CacheRegisterSyscacheCallback(USERMAPPINGOID,
mysql_inval_callback, (Datum) 0);
+ if (IS_THREAD_POOL_SESSION)
+ {
+ u_sess->fdw_ctx[MYSQL_TYPE_FDW].fdwExitFunc = mysql_fdw_exit;
+ }
+ else
+ {
+ on_proc_exit(mysql_fdw_exit, 0);
+ }
}
/* Create hash key for the entry. Assume no pad bytes in key struct */
@@ -102,7 +112,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((HTAB*)u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList, &key, HASH_ENTER, &found);
if (!found)
{
/* initialize new hashtable entry (key is already filled in) */
@@ -183,10 +193,10 @@ mysql_cleanup_connection(void)
HASH_SEQ_STATUS scan;
ConnCacheEntry *entry;
- if (ConnectionHash == NULL)
+ if (u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList == NULL)
return;
- hash_seq_init(&scan, ConnectionHash);
+ hash_seq_init(&scan, (HTAB*)u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
if (entry->conn == NULL)
@@ -196,6 +206,9 @@ mysql_cleanup_connection(void)
_mysql_close(entry->conn);
entry->conn = NULL;
}
+ /* clean-up memory */
+ hash_destroy((HTAB*)u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList);
+ u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList = NULL;
}
/*
@@ -207,10 +220,10 @@ mysql_rel_connection(MYSQL *conn)
HASH_SEQ_STATUS scan;
ConnCacheEntry *entry;
- if (ConnectionHash == NULL)
+ if (u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList == NULL)
return;
- hash_seq_init(&scan, ConnectionHash);
+ hash_seq_init(&scan, (HTAB*)u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
if (entry->conn == NULL)
@@ -306,7 +319,7 @@ mysql_inval_callback(Datum arg, int cacheid, uint32 hashvalue)
Assert(cacheid == FOREIGNSERVEROID || cacheid == USERMAPPINGOID);
/* ConnectionHash must exist already, if we're registered */
- hash_seq_init(&scan, ConnectionHash);
+ hash_seq_init(&scan, (HTAB*)u_sess->fdw_ctx[MYSQL_TYPE_FDW].connList);
while ((entry = (ConnCacheEntry *) hash_seq_search(&scan)))
{
/* Ignore invalid entries */
diff --git deparse.cpp deparse.cpp
index a75c2705..94b1799c 100644
--- deparse.cpp
+++ 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 mysql_fdw.cpp mysql_fdw.cpp
index d518e2ec..a56fae67 100644
--- mysql_fdw.cpp
+++ 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;
@@ -1052,12 +1088,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 */
@@ -1160,7 +1196,7 @@ mysqlGetForeignPlan(
mysql_append_where_clause(&sql, root, baserel, remote_conds,
true, &params_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))
{
@@ -1330,7 +1366,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;
@@ -1644,7 +1680,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)
@@ -1833,7 +1869,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 mysql_fdw.h mysql_fdw.h
index 5b543cd0..ea58af7f 100644
--- mysql_fdw.h
+++ 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_prepare)(MYSQL_STMT *stmt, const char *query, unsigned long length));
+extern int ((*_mysql_stmt_execute)(MYSQL_STMT *stmt));
+extern int ((*_mysql_stmt_fetch)(MYSQL_STMT *stmt));
+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 mysql_query.cpp mysql_query.cpp
index 8c25f5cc..64fd770a 100644
--- mysql_query.cpp
+++ mysql_query.cpp
@@ -21,7 +21,7 @@
#include <unistd.h>
#include <mysql.h>
-#include <mysql_com.h>
+#include <mariadb_com.h>
#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,9 @@ 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*)palloc(sizeof(my_bool));
+ *(binds[attnum].is_null) = *isnull;
/* Avoid to bind buffer in case value is NULL */
if (*isnull)
@@ -250,7 +252,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 +261,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 +270,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 +279,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 +288,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 +298,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 +307,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 +350,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 +366,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 +386,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 +414,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 +440,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 option.cpp option.cpp
index 574cb24a..5c92c50f 100644
--- option.cpp
+++ 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);