From 93e431057a3b8f90b4ca941fd9891e8a4cbffe48 Mon Sep 17 00:00:00 2001 From: "hy.li" Date: Thu, 14 Dec 2023 16:15:18 +0800 Subject: [PATCH 1/2] PG14+ support --- README.md | 54 +++++++++++++++++++++++++++++------------ foreign_table_exposer.c | 19 +++++++++++++-- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 4540a2f..199132f 100644 --- a/README.md +++ b/README.md @@ -4,35 +4,58 @@ This PostgreSQL extension exposes foreign tables like a normal table with rewrit ## Installation - $ make - $ sudo make install +Add a directory of `pg_config` to PATH and build and install it. + +```sh +make USE_PGXS=1 +make install USE_PGXS=1 +``` + +If you want to build it in a source tree of PostgreSQL, use + +```sh +make +make install +``` or - $ pgxnclient install foreign_table_exposer +```bash + pgxnclient install foreign_table_exposer +``` ## Setup + Write this line in your `postgresql.conf` and then restart PostgreSQL. - shared_preload_libraries = 'foreign_table_exposer' +``` +shared_preload_libraries = 'foreign_table_exposer' +``` Execute this statement when you want to enable this feature. - CREATE EXTENSION foreign_table_exposer; - +```sql +CREATE EXTENSION foreign_table_exposer; +``` + ## Usage + When you scan `pg_catalog.pg_class` with a predicate like `relkind in ('r', 'v')`, this extension automatically rewrites the query to include `'f'` (foreign table). - postgres=# - select - relname, nspname, relkind - from - pg_catalog.pg_class c, - pg_catalog.pg_namespace n - where relkind in ('r', 'v') and - nspname not in ('pg_catalog', 'information_schema', 'pg_toast', 'pg_temp_1') and - n.oid = relnamespace order by nspname, relname; +```sql +select + relname, nspname, relkind +from + pg_catalog.pg_class c, + pg_catalog.pg_namespace n +where relkind in ('r', 'v') and + nspname not in ('pg_catalog', 'information_schema', 'pg_toast', 'pg_temp_1') and + n.oid = relnamespace order by nspname, relname; +``` + +returns +``` relname | nspname | relkind ------------------+---------+--------- normal_tbl | public | r @@ -40,3 +63,4 @@ When you scan `pg_catalog.pg_class` with a predicate like `relkind in ('r', 'v') example_view | public | v (3 rows) +``` diff --git a/foreign_table_exposer.c b/foreign_table_exposer.c index 8914dbf..d032be2 100644 --- a/foreign_table_exposer.c +++ b/foreign_table_exposer.c @@ -44,7 +44,11 @@ static post_parse_analyze_hook_type prev_post_parse_analyze_hook = NULL; void _PG_init(void); void _PG_fini(void); +#if PG14_LT static void fte_post_parse_analyse(ParseState *pstate, Query *query); +#else +static void fte_post_parse_analyse(ParseState *pstate, Query *query,JumbleState *jstate); +#endif static void rewrite_query(Query *query); static bool walker(Node *node, List *relkinds); @@ -75,11 +79,20 @@ _PG_fini(void) * Post-parse-analysis hook: mark query with a queryId */ static void -fte_post_parse_analyse(ParseState *pstate, Query *query) + +#if PG14_LT + fte_post_parse_analyse(ParseState *pstate, Query *query) +#else + fte_post_parse_analyse(ParseState *pstate, Query *query,JumbleState *jstate) +#endif { if (prev_post_parse_analyze_hook) { +#if PG14_LT prev_post_parse_analyze_hook(pstate, query); +#else + prev_post_parse_analyze_hook(pstate, query, jstate); +#endif } rewrite_query(query); @@ -135,13 +148,15 @@ rewrite_query(Query *query) if (is_pg_class && rte->eref != NULL) { int varattrno_index = 1; ListCell *lc_colname; + PgClassRelKindPos *relkindPos; foreach(lc_colname, rte->eref->colnames) { char *colname = strVal(lfirst(lc_colname)); if (strcmp(colname, COL_RELKIND) == 0) { ereport(DEBUG1, (errmsg("Found pg_catalog.pg_class.relkind: [varno:%d, varattno:%d]", varno_index, varattrno_index))); - PgClassRelKindPos *relkindPos = (PgClassRelKindPos*) palloc(sizeof(PgClassRelKindPos)); + + relkindPos = (PgClassRelKindPos*) palloc(sizeof(PgClassRelKindPos)); relkindPos->varno = varno_index; relkindPos->varattno = varattrno_index; relkinds = lappend(relkinds, relkindPos); From bed1430a6a6d88e39a32ccfb576e24ac9311201a Mon Sep 17 00:00:00 2001 From: "hy.li" Date: Thu, 14 Dec 2023 16:15:41 +0800 Subject: [PATCH 2/2] update README --- foreign_table_exposer.dylib | Bin 0 -> 116544 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 foreign_table_exposer.dylib diff --git a/foreign_table_exposer.dylib b/foreign_table_exposer.dylib new file mode 100755 index 0000000000000000000000000000000000000000..14ef425dae1420cfc78f84b186c0bafdcaf4be4e GIT binary patch literal 116544 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 H^qT(%d`N>G literal 0 HcmV?d00001