From efb925255c41f0f48f7b8a112853f2d22ddedbfa Mon Sep 17 00:00:00 2001 From: luozihao <1165977584@qq.com> Date: Tue, 20 Sep 2022 10:42:25 +0800 Subject: [PATCH] =?UTF-8?q?=20=E5=A4=8DSPI=E4=B8=8D=E8=83=BD=E5=9C=A8dolph?= =?UTF-8?q?in=E6=8F=92=E4=BB=B6=E4=B8=8B=E9=80=89=E6=8B=A9dolphin=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E8=A7=A3=E6=9E=90=E5=99=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/executor/spi.h | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h index 80fb52f26..87c8a89eb 100644 --- a/src/include/executor/spi.h +++ b/src/include/executor/spi.h @@ -69,6 +69,19 @@ typedef List* (*parse_query_func)(const char *query_string, List **query_string_ /* in postgres.cpp, avoid include tcopprot.h */ extern List* raw_parser(const char* query_string, List** query_string_locationlist); +static inline parse_query_func GetRawParser() +{ +#ifndef ENABLE_MULTIPLE_NODES + if (u_sess->attr.attr_sql.dolphin) { + int id = GetCustomParserId(); + if (id >= 0 && g_instance.raw_parser_hook[id] != NULL) { + return (parse_query_func)g_instance.raw_parser_hook[id]; + } + } +#endif + return raw_parser; +} + extern THR_LOCAL PGDLLIMPORT uint32 SPI_processed; extern THR_LOCAL PGDLLIMPORT SPITupleTable* SPI_tuptable; extern THR_LOCAL PGDLLIMPORT int SPI_result; @@ -82,18 +95,18 @@ extern void SPI_pop(void); extern bool SPI_push_conditional(void); extern void SPI_pop_conditional(bool pushed); extern void SPI_restore_connection(void); -extern int SPI_execute(const char* src, bool read_only, long tcount, bool isCollectParam = false, parse_query_func parser = raw_parser); +extern int SPI_execute(const char* src, bool read_only, long tcount, bool isCollectParam = false, parse_query_func parser = GetRawParser()); extern int SPI_execute_plan(SPIPlanPtr plan, Datum* Values, const char* Nulls, bool read_only, long tcount); extern int SPI_execute_plan_with_paramlist(SPIPlanPtr plan, ParamListInfo params, bool read_only, long tcount); -extern int SPI_exec(const char* src, long tcount, parse_query_func parser = raw_parser); +extern int SPI_exec(const char* src, long tcount, parse_query_func parser = GetRawParser()); extern int SPI_execp(SPIPlanPtr plan, Datum* Values, const char* Nulls, long tcount); extern int SPI_execute_snapshot(SPIPlanPtr plan, Datum* Values, const char* Nulls, Snapshot snapshot, Snapshot crosscheck_snapshot, bool read_only, bool fire_triggers, long tcount); extern int SPI_execute_with_args(const char* src, int nargs, Oid* argtypes, Datum* Values, const char* Nulls, - bool read_only, long tcount, Cursor_Data* cursor_data, parse_query_func parser = raw_parser); -extern SPIPlanPtr SPI_prepare(const char* src, int nargs, Oid* argtypes, parse_query_func parser = raw_parser); -extern SPIPlanPtr SPI_prepare_cursor(const char* src, int nargs, Oid* argtypes, int cursorOptions, parse_query_func parser = raw_parser); -extern SPIPlanPtr SPI_prepare_params(const char* src, ParserSetupHook parserSetup, void* parserSetupArg, int cursorOptions, parse_query_func parser = raw_parser); + bool read_only, long tcount, Cursor_Data* cursor_data, parse_query_func parser = GetRawParser()); +extern SPIPlanPtr SPI_prepare(const char* src, int nargs, Oid* argtypes, parse_query_func parser = GetRawParser()); +extern SPIPlanPtr SPI_prepare_cursor(const char* src, int nargs, Oid* argtypes, int cursorOptions, parse_query_func parser = GetRawParser()); +extern SPIPlanPtr SPI_prepare_params(const char* src, ParserSetupHook parserSetup, void* parserSetupArg, int cursorOptions, parse_query_func parser = GetRawParser()); extern int SPI_keepplan(SPIPlanPtr plan); extern SPIPlanPtr SPI_saveplan(SPIPlanPtr plan); extern int SPI_freeplan(SPIPlanPtr plan); @@ -127,7 +140,7 @@ extern void SPI_freetuptable(SPITupleTable* tuptable); extern Portal SPI_cursor_open(const char* name, SPIPlanPtr plan, Datum* Values, const char* Nulls, bool read_only); extern Portal SPI_cursor_open_with_args(const char* name, const char* src, int nargs, Oid* argtypes, Datum* Values, - const char* Nulls, bool read_only, int cursorOptions, parse_query_func parser = raw_parser); + const char* Nulls, bool read_only, int cursorOptions, parse_query_func parser = GetRawParser()); extern Portal SPI_cursor_open_with_paramlist(const char* name, SPIPlanPtr plan, ParamListInfo params, bool read_only, bool isCollectParam = false); extern Portal SPI_cursor_find(const char* name); @@ -155,23 +168,23 @@ extern void ReleaseSpiPlanRef(TransactionId mysubid); /* SPI execution helpers */ extern void spi_exec_with_callback(CommandDest dest, const char* src, bool read_only, long tcount, bool direct_call, - void (*callbackFn)(void*), void* clientData, parse_query_func parser = raw_parser); + void (*callbackFn)(void*), void* clientData, parse_query_func parser = GetRawParser()); extern void _SPI_error_callback(void *arg); extern List* _SPI_get_querylist(SPIPlanPtr plan); #ifdef PGXC -extern int SPI_execute_direct(const char* src, char* nodename, parse_query_func parser = raw_parser); +extern int SPI_execute_direct(const char* src, char* nodename, parse_query_func parser = GetRawParser()); #endif extern int _SPI_begin_call(bool execmem); extern int _SPI_end_call(bool procmem); extern void _SPI_hold_cursor(bool is_rollback = false); -extern void _SPI_prepare_oneshot_plan_for_validator(const char* src, SPIPlanPtr plan, parse_query_func parser = raw_parser); +extern void _SPI_prepare_oneshot_plan_for_validator(const char* src, SPIPlanPtr plan, parse_query_func parser = GetRawParser()); extern void InitSPIPlanCxt(); -extern void _SPI_prepare_plan(const char *src, SPIPlanPtr plan, parse_query_func parser = raw_parser); +extern void _SPI_prepare_plan(const char *src, SPIPlanPtr plan, parse_query_func parser = GetRawParser()); extern ParamListInfo _SPI_convert_params(int nargs, Oid *argtypes, Datum *Values, const char *Nulls, Cursor_Data *cursor_data = NULL); -extern void _SPI_prepare_oneshot_plan(const char *src, SPIPlanPtr plan, parse_query_func parser = raw_parser); +extern void _SPI_prepare_oneshot_plan(const char *src, SPIPlanPtr plan, parse_query_func parser = GetRawParser()); extern int _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI, Snapshot snapshot, Snapshot crosscheck_snapshot, bool read_only, bool fire_triggers, long tcount, bool from_lock = false);