Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd45843e

Browse files
committed
COPY FROM deparse more complete, PG_SHARDMAN macro.
Now column names, FORCE NULL and FORCE NOT NULL are deparsed too.PG_SHARDMAN macro ensures this PG contains patches for Postgres.
1 parent09aaf41 commitd45843e

File tree

5 files changed

+91
-16
lines changed

5 files changed

+91
-16
lines changed

‎contrib/postgres_fdw/deparse.c

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3176,33 +3176,89 @@ get_relation_column_alias_ids(Var *node, RelOptInfo *foreignrel,
31763176
}
31773177

31783178
/*
3179-
* Deparse COPY FROM
3179+
* Deparse COPY FROM into given buf.
31803180
*/
31813181
void
31823182
deparseCopyFromSql(StringInfobuf,Relationrel,CopyStatecstate,
31833183
constchar*dest_relname)
31843184
{
3185+
ListCell*cur;
3186+
31853187
appendStringInfoString(buf,"COPY ");
31863188
if (dest_relname==NULL)
31873189
deparseRelation(buf,rel);
31883190
else
31893191
appendStringInfoString(buf,dest_relname);
3190-
appendStringInfoString(buf," FROM STDIN WITH (");
31913192

3192-
/* TODO: deparse column names */
31933193
if (cstate->binary)
31943194
{
3195-
ereport(ERROR,
3196-
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
3197-
errmsg("cannot copy to postgres_fdw table \"%s\" in binary format ",
3198-
RelationGetRelationName(rel))));
3195+
ereport(ERROR,
3196+
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
3197+
errmsg("cannot copy to postgres_fdw table \"%s\" in binary format ",
3198+
RelationGetRelationName(rel))));
3199+
}
3200+
3201+
/* deparse column names */
3202+
if (cstate->attnumlist!=NIL)
3203+
{
3204+
boolfirst= true;
3205+
3206+
appendStringInfoString(buf," (");
3207+
foreach(cur,cstate->attnumlist)
3208+
{
3209+
intattnum=lfirst_int(cur);
3210+
char*attname;
3211+
3212+
if (!first)
3213+
appendStringInfoString(buf,", ");
3214+
first= false;
3215+
3216+
attname=get_relid_attribute_name(rel->rd_id,attnum);
3217+
appendStringInfoString(buf,quote_identifier(attname));
3218+
}
3219+
appendStringInfoString(buf," )");
31993220
}
3221+
3222+
appendStringInfoString(buf," FROM STDIN WITH (");
32003223
if (cstate->csv_mode)
32013224
{
32023225
appendStringInfoString(buf," FORMAT csv ");
32033226
appendStringInfo(buf,", QUOTE '%c'",*(cstate->quote));
32043227
appendStringInfo(buf,", ESCAPE '%c'",*(cstate->escape));
3205-
/* TODO: force quote, force not null, force null */
3228+
if (cstate->force_notnull!=NIL)
3229+
{
3230+
boolfirst= true;
3231+
3232+
appendStringInfoString(buf," FORCE NOT NULL (");
3233+
foreach(cur,cstate->force_notnull)
3234+
{
3235+
char*attname=strVal(lfirst(cur));
3236+
3237+
if (!first)
3238+
appendStringInfoString(buf,", ");
3239+
first= false;
3240+
3241+
appendStringInfoString(buf,quote_identifier(attname));
3242+
}
3243+
appendStringInfoString(buf," )");
3244+
}
3245+
if (cstate->force_null!=NIL)
3246+
{
3247+
boolfirst= true;
3248+
3249+
appendStringInfoString(buf," FORCE NULL (");
3250+
foreach(cur,cstate->force_null)
3251+
{
3252+
char*attname=strVal(lfirst(cur));
3253+
3254+
if (!first)
3255+
appendStringInfoString(buf,", ");
3256+
first= false;
3257+
3258+
appendStringInfoString(buf,quote_identifier(attname));
3259+
}
3260+
appendStringInfoString(buf," )");
3261+
}
32063262
}
32073263
else
32083264
{

‎contrib/postgres_fdw/postgres_fdw.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ static void postgresGetForeignUpperPaths(PlannerInfo *root,
360360
staticvoidpostgresBeginForeignCopyFrom(EState*estate,
361361
ResultRelInfo*rinfo,
362362
CopyStatecstate,
363-
constchar*dest_relname);
363+
ResultRelInfo*parent_rinfo);
364364
staticvoidpostgresForeignNextCopyFrom(EState*estate,
365365
ResultRelInfo*rinfo,
366366
CopyStatecstate);
@@ -5219,20 +5219,28 @@ postgres_fdw_exec(PG_FUNCTION_ARGS)
52195219
PG_RETURN_VOID();
52205220
}
52215221

5222-
/* Begin COPY FROM to foreign table */
5222+
/*
5223+
* Begin COPY FROM to foreign table. Currently we do it in a bit perverted
5224+
* way: we redirect COPY FROM to parent table on foreign server, assuming it
5225+
* exists in public schema (as in shardman), and let it direct tuples to
5226+
* proper partitions. Otherwise we would have to modify logic of managing
5227+
* connections and keep many connections open to one server from one backend.
5228+
* This probably should not be used outside pg_shardman.
5229+
*/
52235230
staticvoid
52245231
postgresBeginForeignCopyFrom(EState*estate,ResultRelInfo*rinfo,
5225-
CopyStatecstate,constchar*dest_relname)
5232+
CopyStatecstate,ResultRelInfo*parent_rinfo)
52265233
{
52275234
Relationrel=rinfo->ri_RelationDesc;
52285235
RangeTblEntry*rte;
52295236
Oiduserid;
52305237
ForeignTable*table;
52315238
UserMapping*user;
52325239
StringInfoDatasql;
5233-
PGconn*conn;
5234-
PGresult*res;
5235-
bool*copy_from_started;
5240+
PGconn*conn;
5241+
PGresult*res;
5242+
bool*copy_from_started;
5243+
char*dest_relname;
52365244

52375245
/*
52385246
* Identify which user to do the remote access as. This should match what
@@ -5253,6 +5261,11 @@ postgresBeginForeignCopyFrom(EState *estate, ResultRelInfo *rinfo,
52535261
return;
52545262

52555263
/* deparse COPY stmt */
5264+
dest_relname=psprintf(
5265+
"public.%s",quote_identifier(RelationGetRelationName(
5266+
parent_rinfo==NULL ?
5267+
rinfo->ri_RelationDesc :
5268+
parent_rinfo->ri_RelationDesc)));
52565269
initStringInfo(&sql);
52575270
deparseCopyFromSql(&sql,rel,cstate,dest_relname);
52585271

@@ -5327,4 +5340,4 @@ _PG_init(void)
53275340
"Use repeatable read isilation error for remote transactions",NULL,
53285341
&UseRepeatableRead, true,PGC_USERSET,0,NULL,
53295342
NULL,NULL);
5330-
}
5343+
}

‎src/include/foreign/fdwapi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ typedef bool (*IsForeignScanParallelSafe_function) (PlannerInfo *root,
163163
typedefvoid (*BeginForeignCopyFrom_function) (EState*estate,
164164
ResultRelInfo*rinfo,
165165
CopyStatecstate,
166-
constchar*dest_relname);
166+
ResultRelInfo*parent_rinfo);
167167
/*
168168
* Currently we support only text and csv format and pass each row in
169169
* cstate->line_buf. We should also pass binary data and/or deformed tuple.

‎src/include/pg_config.h.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,9 @@
753753
/* PostgreSQL version as a number */
754754
#undef PG_VERSION_NUM
755755

756+
/* This version contains patches for pg_shardman */
757+
#definePG_SHARDMAN
758+
756759
/* A string containing the version number, platform, and C compiler */
757760
#undef PG_VERSION_STR
758761

‎src/include/pg_config.h.win32

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,9 @@
565565
/* PostgreSQL version as a number */
566566
#define PG_VERSION_NUM 100000
567567

568+
/* This version contains patches for pg_shardman */
569+
#define PG_SHARDMAN
570+
568571
/* Define to the one symbol short name of this package. */
569572
#define PACKAGE_TARNAME "postgresql"
570573

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp