mirror of
https://github.com/postgres/postgres.git
synced 2025-06-26 12:21:12 +03:00
Provide readfuncs support for custom scans.
Commit a0d9f6e434
added this support for
all other plan node types; this fills in the gap.
Since TextOutCustomScan complicates this and is pretty well useless,
remove it.
KaiGai Kohei, with some modifications by me.
This commit is contained in:
@ -613,10 +613,11 @@ _outCustomScan(StringInfo str, const CustomScan *node)
|
||||
WRITE_NODE_FIELD(custom_private);
|
||||
WRITE_NODE_FIELD(custom_scan_tlist);
|
||||
WRITE_BITMAPSET_FIELD(custom_relids);
|
||||
/* Dump library and symbol name instead of raw pointer */
|
||||
appendStringInfoString(str, " :methods ");
|
||||
_outToken(str, node->methods->CustomName);
|
||||
if (node->methods->TextOutCustomScan)
|
||||
node->methods->TextOutCustomScan(str, node);
|
||||
_outToken(str, node->methods->LibraryName);
|
||||
appendStringInfoChar(str, ' ');
|
||||
_outToken(str, node->methods->SymbolName);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -28,6 +28,7 @@
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "fmgr.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
#include "nodes/plannodes.h"
|
||||
#include "nodes/readfuncs.h"
|
||||
@ -1806,6 +1807,44 @@ _readForeignScan(void)
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
/*
|
||||
* _readCustomScan
|
||||
*/
|
||||
static CustomScan *
|
||||
_readCustomScan(void)
|
||||
{
|
||||
READ_LOCALS(CustomScan);
|
||||
char *library_name;
|
||||
char *symbol_name;
|
||||
const CustomScanMethods *methods;
|
||||
|
||||
ReadCommonScan(&local_node->scan);
|
||||
|
||||
READ_UINT_FIELD(flags);
|
||||
READ_NODE_FIELD(custom_plans);
|
||||
READ_NODE_FIELD(custom_exprs);
|
||||
READ_NODE_FIELD(custom_private);
|
||||
READ_NODE_FIELD(custom_scan_tlist);
|
||||
READ_BITMAPSET_FIELD(custom_relids);
|
||||
|
||||
/*
|
||||
* Reconstruction of methods using library and symbol name
|
||||
*/
|
||||
token = pg_strtok(&length); /* skip methods: */
|
||||
token = pg_strtok(&length); /* LibraryName */
|
||||
library_name = nullable_string(token, length);
|
||||
token = pg_strtok(&length); /* SymbolName */
|
||||
symbol_name = nullable_string(token, length);
|
||||
|
||||
methods = (const CustomScanMethods *)
|
||||
load_external_function(library_name, symbol_name, true, NULL);
|
||||
Assert(strcmp(methods->LibraryName, library_name) == 0 &&
|
||||
strcmp(methods->SymbolName, symbol_name) == 0);
|
||||
local_node->methods = methods;
|
||||
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
/*
|
||||
* ReadCommonJoin
|
||||
* Assign the basic stuff of all nodes that inherit from Join
|
||||
@ -2362,6 +2401,8 @@ parseNodeString(void)
|
||||
return_value = _readWorkTableScan();
|
||||
else if (MATCH("FOREIGNSCAN", 11))
|
||||
return_value = _readForeignScan();
|
||||
else if (MATCH("CUSTOMSCAN", 10))
|
||||
return_value = _readCustomScan();
|
||||
else if (MATCH("JOIN", 4))
|
||||
return_value = _readJoin();
|
||||
else if (MATCH("NESTLOOP", 8))
|
||||
|
Reference in New Issue
Block a user