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

Commit871a978

Browse files
author
Nikita Glukhov
committed
Add generic type subscription
1 parentf2e016f commit871a978

File tree

38 files changed

+1371
-752
lines changed

38 files changed

+1371
-752
lines changed

‎contrib/pg_stat_statements/pg_stat_statements.c‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2464,14 +2464,14 @@ JumbleExpr(pgssJumbleState *jstate, Node *node)
24642464
JumbleExpr(jstate, (Node*)expr->aggfilter);
24652465
}
24662466
break;
2467-
caseT_ArrayRef:
2467+
caseT_SubscriptionRef:
24682468
{
2469-
ArrayRef*aref= (ArrayRef*)node;
2469+
SubscriptionRef*sbsref= (SubscriptionRef*)node;
24702470

2471-
JumbleExpr(jstate, (Node*)aref->refupperindexpr);
2472-
JumbleExpr(jstate, (Node*)aref->reflowerindexpr);
2473-
JumbleExpr(jstate, (Node*)aref->refexpr);
2474-
JumbleExpr(jstate, (Node*)aref->refassgnexpr);
2471+
JumbleExpr(jstate, (Node*)sbsref->refupperindexpr);
2472+
JumbleExpr(jstate, (Node*)sbsref->reflowerindexpr);
2473+
JumbleExpr(jstate, (Node*)sbsref->refexpr);
2474+
JumbleExpr(jstate, (Node*)sbsref->refassgnexpr);
24752475
}
24762476
break;
24772477
caseT_FuncExpr:

‎contrib/postgres_fdw/deparse.c‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static void deparseExpr(Expr *expr, deparse_expr_cxt *context);
137137
staticvoiddeparseVar(Var*node,deparse_expr_cxt*context);
138138
staticvoiddeparseConst(Const*node,deparse_expr_cxt*context);
139139
staticvoiddeparseParam(Param*node,deparse_expr_cxt*context);
140-
staticvoiddeparseArrayRef(ArrayRef*node,deparse_expr_cxt*context);
140+
staticvoiddeparseSubscriptionRef(SubscriptionRef*node,deparse_expr_cxt*context);
141141
staticvoiddeparseFuncExpr(FuncExpr*node,deparse_expr_cxt*context);
142142
staticvoiddeparseOpExpr(OpExpr*node,deparse_expr_cxt*context);
143143
staticvoiddeparseOperatorName(StringInfobuf,Form_pg_operatoropform);
@@ -357,9 +357,9 @@ foreign_expr_walker(Node *node,
357357
state=FDW_COLLATE_UNSAFE;
358358
}
359359
break;
360-
caseT_ArrayRef:
360+
caseT_SubscriptionRef:
361361
{
362-
ArrayRef*ar= (ArrayRef*)node;
362+
SubscriptionRef*ar= (SubscriptionRef*)node;
363363

364364
/* Assignment should not be in restrictions. */
365365
if (ar->refassgnexpr!=NULL)
@@ -1799,8 +1799,8 @@ deparseExpr(Expr *node, deparse_expr_cxt *context)
17991799
caseT_Param:
18001800
deparseParam((Param*)node,context);
18011801
break;
1802-
caseT_ArrayRef:
1803-
deparseArrayRef((ArrayRef*)node,context);
1802+
caseT_SubscriptionRef:
1803+
deparseSubscriptionRef((SubscriptionRef*)node,context);
18041804
break;
18051805
caseT_FuncExpr:
18061806
deparseFuncExpr((FuncExpr*)node,context);
@@ -2020,7 +2020,7 @@ deparseParam(Param *node, deparse_expr_cxt *context)
20202020
* Deparse an array subscript expression.
20212021
*/
20222022
staticvoid
2023-
deparseArrayRef(ArrayRef*node,deparse_expr_cxt*context)
2023+
deparseSubscriptionRef(SubscriptionRef*node,deparse_expr_cxt*context)
20242024
{
20252025
StringInfobuf=context->buf;
20262026
ListCell*lowlist_item;

‎src/backend/catalog/heap.c‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -977,7 +977,8 @@ AddNewRelationType(const char *typeName,
977977
-1,/* typmod */
978978
0,/* array dimensions for typBaseType */
979979
false,/* Type NOT NULL */
980-
InvalidOid);/* rowtypes never have a collation */
980+
InvalidOid,/* rowtypes never have a collation */
981+
InvalidOid);
981982
}
982983

983984
/* --------------------------------
@@ -1244,7 +1245,8 @@ heap_create_with_catalog(const char *relname,
12441245
-1,/* typmod */
12451246
0,/* array dimensions for typBaseType */
12461247
false,/* Type NOT NULL */
1247-
InvalidOid);/* rowtypes never have a collation */
1248+
InvalidOid,/* rowtypes never have a collation */
1249+
F_ARRAY_SUBSCRIPTION);
12481250

12491251
pfree(relarrayname);
12501252
}

‎src/backend/catalog/pg_type.c‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
118118
values[Anum_pg_type_typtypmod-1]=Int32GetDatum(-1);
119119
values[Anum_pg_type_typndims-1]=Int32GetDatum(0);
120120
values[Anum_pg_type_typcollation-1]=ObjectIdGetDatum(InvalidOid);
121+
values[Anum_pg_type_typsubscription-1]=ObjectIdGetDatum(InvalidOid);
121122
nulls[Anum_pg_type_typdefaultbin-1]= true;
122123
nulls[Anum_pg_type_typdefault-1]= true;
123124
nulls[Anum_pg_type_typacl-1]= true;
@@ -166,6 +167,7 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
166167
false,
167168
InvalidOid,
168169
InvalidOid,
170+
InvalidOid,
169171
NULL,
170172
false);
171173

@@ -224,7 +226,8 @@ TypeCreate(Oid newTypeOid,
224226
int32typeMod,
225227
int32typNDims,/* Array dimensions for baseType */
226228
booltypeNotNull,
227-
OidtypeCollation)
229+
OidtypeCollation,
230+
OidsubscriptionProcedure)
228231
{
229232
Relationpg_type_desc;
230233
OidtypeObjectId;
@@ -364,6 +367,7 @@ TypeCreate(Oid newTypeOid,
364367
values[Anum_pg_type_typtypmod-1]=Int32GetDatum(typeMod);
365368
values[Anum_pg_type_typndims-1]=Int32GetDatum(typNDims);
366369
values[Anum_pg_type_typcollation-1]=ObjectIdGetDatum(typeCollation);
370+
values[Anum_pg_type_typsubscription-1]=ObjectIdGetDatum(subscriptionProcedure);
367371

368372
/*
369373
* initialize the default binary value for this type. Check for nulls of
@@ -484,6 +488,7 @@ TypeCreate(Oid newTypeOid,
484488
isImplicitArray,
485489
baseType,
486490
typeCollation,
491+
subscriptionProcedure,
487492
(defaultTypeBin ?
488493
stringToNode(defaultTypeBin) :
489494
NULL),
@@ -530,6 +535,7 @@ GenerateTypeDependencies(Oid typeNamespace,
530535
boolisImplicitArray,
531536
OidbaseType,
532537
OidtypeCollation,
538+
OidsubscriptionProcedure,
533539
Node*defaultExpr,
534540
boolrebuild)
535541
{
@@ -682,6 +688,14 @@ GenerateTypeDependencies(Oid typeNamespace,
682688
/* Normal dependency on the default expression. */
683689
if (defaultExpr)
684690
recordDependencyOnExpr(&myself,defaultExpr,NIL,DEPENDENCY_NORMAL);
691+
692+
if (OidIsValid(subscriptionProcedure))
693+
{
694+
referenced.classId=ProcedureRelationId;
695+
referenced.objectId=subscriptionProcedure;
696+
referenced.objectSubId=0;
697+
recordDependencyOn(&myself,&referenced,DEPENDENCY_NORMAL);
698+
}
685699
}
686700

687701
/*

‎src/backend/commands/typecmds.c‎

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ DefineType(List *names, List *parameters)
123123
List*typmodinName=NIL;
124124
List*typmodoutName=NIL;
125125
List*analyzeName=NIL;
126+
List*subscriptionName=NIL;
126127
charcategory=TYPCATEGORY_USER;
127128
boolpreferred= false;
128129
chardelimiter=DEFAULT_TYPDELIM;
@@ -141,6 +142,7 @@ DefineType(List *names, List *parameters)
141142
DefElem*typmodinNameEl=NULL;
142143
DefElem*typmodoutNameEl=NULL;
143144
DefElem*analyzeNameEl=NULL;
145+
DefElem*subscriptionNameEl=NULL;
144146
DefElem*categoryEl=NULL;
145147
DefElem*preferredEl=NULL;
146148
DefElem*delimiterEl=NULL;
@@ -163,6 +165,7 @@ DefineType(List *names, List *parameters)
163165
Oidresulttype;
164166
ListCell*pl;
165167
ObjectAddressaddress;
168+
OidsubscriptionOid;
166169

167170
/*
168171
* As of Postgres 8.4, we require superuser privilege to create a base
@@ -262,6 +265,9 @@ DefineType(List *names, List *parameters)
262265
elseif (pg_strcasecmp(defel->defname,"analyze")==0||
263266
pg_strcasecmp(defel->defname,"analyse")==0)
264267
defelp=&analyzeNameEl;
268+
elseif (pg_strcasecmp(defel->defname,"subscription")==0||
269+
pg_strcasecmp(defel->defname,"subscription")==0)
270+
defelp=&subscriptionNameEl;
265271
elseif (pg_strcasecmp(defel->defname,"category")==0)
266272
defelp=&categoryEl;
267273
elseif (pg_strcasecmp(defel->defname,"preferred")==0)
@@ -330,6 +336,8 @@ DefineType(List *names, List *parameters)
330336
typmodoutName=defGetQualifiedName(typmodoutNameEl);
331337
if (analyzeNameEl)
332338
analyzeName=defGetQualifiedName(analyzeNameEl);
339+
if (subscriptionNameEl)
340+
subscriptionName=defGetQualifiedName(subscriptionNameEl);
333341
if (categoryEl)
334342
{
335343
char*p=defGetString(categoryEl);
@@ -511,6 +519,9 @@ DefineType(List *names, List *parameters)
511519
if (analyzeName)
512520
analyzeOid=findTypeAnalyzeFunction(analyzeName,typoid);
513521

522+
if (subscriptionName)
523+
subscriptionOid=findTypeAnalyzeFunction(subscriptionName,typoid);
524+
514525
/*
515526
* Check permissions on functions. We choose to require the creator/owner
516527
* of a type to also own the underlying functions. Since creating a type
@@ -630,7 +641,8 @@ DefineType(List *names, List *parameters)
630641
-1,/* typMod (Domains only) */
631642
0,/* Array Dimensions of typbasetype */
632643
false,/* Type NOT NULL */
633-
collation);/* type's collation */
644+
collation,/* type's collation */
645+
subscriptionOid);
634646
Assert(typoid==address.objectId);
635647

636648
/*
@@ -671,7 +683,8 @@ DefineType(List *names, List *parameters)
671683
-1,/* typMod (Domains only) */
672684
0,/* Array dimensions of typbasetype */
673685
false,/* Type NOT NULL */
674-
collation);/* type's collation */
686+
collation,/* type's collation */
687+
F_ARRAY_SUBSCRIPTION);
675688

676689
pfree(array_type);
677690

@@ -733,6 +746,7 @@ DefineDomain(CreateDomainStmt *stmt)
733746
OidreceiveProcedure;
734747
OidsendProcedure;
735748
OidanalyzeProcedure;
749+
OidsubscriptionProcedure;
736750
boolbyValue;
737751
charcategory;
738752
chardelimiter;
@@ -856,6 +870,9 @@ DefineDomain(CreateDomainStmt *stmt)
856870
/* Analysis function */
857871
analyzeProcedure=baseType->typanalyze;
858872

873+
/* Subscription function */
874+
subscriptionProcedure=baseType->typsubscription;
875+
859876
/* Inherited default value */
860877
datum=SysCacheGetAttr(TYPEOID,typeTup,
861878
Anum_pg_type_typdefault,&isnull);
@@ -1057,7 +1074,8 @@ DefineDomain(CreateDomainStmt *stmt)
10571074
basetypeMod,/* typeMod value */
10581075
typNDims,/* Array dimensions for base type */
10591076
typNotNull,/* Type NOT NULL */
1060-
domaincoll);/* type's collation */
1077+
domaincoll,/* type's collation */
1078+
subscriptionProcedure);
10611079

10621080
/*
10631081
* Process constraints which refer to the domain ID returned by TypeCreate
@@ -1169,7 +1187,8 @@ DefineEnum(CreateEnumStmt *stmt)
11691187
-1,/* typMod (Domains only) */
11701188
0,/* Array dimensions of typbasetype */
11711189
false,/* Type NOT NULL */
1172-
InvalidOid);/* type's collation */
1190+
InvalidOid,/* type's collation */
1191+
InvalidOid);
11731192

11741193
/* Enter the enum's values into pg_enum */
11751194
EnumValuesCreate(enumTypeAddr.objectId,stmt->vals);
@@ -1209,7 +1228,8 @@ DefineEnum(CreateEnumStmt *stmt)
12091228
-1,/* typMod (Domains only) */
12101229
0,/* Array dimensions of typbasetype */
12111230
false,/* Type NOT NULL */
1212-
InvalidOid);/* type's collation */
1231+
InvalidOid,/* type's collation */
1232+
F_ARRAY_SUBSCRIPTION);
12131233

12141234
pfree(enumArrayName);
12151235

@@ -1508,7 +1528,8 @@ DefineRange(CreateRangeStmt *stmt)
15081528
-1,/* typMod (Domains only) */
15091529
0,/* Array dimensions of typbasetype */
15101530
false,/* Type NOT NULL */
1511-
InvalidOid);/* type's collation (ranges never have one) */
1531+
InvalidOid,/* type's collation (ranges never have one) */
1532+
InvalidOid);
15121533
Assert(typoid==address.objectId);
15131534

15141535
/* Create the entry in pg_range */
@@ -1550,7 +1571,8 @@ DefineRange(CreateRangeStmt *stmt)
15501571
-1,/* typMod (Domains only) */
15511572
0,/* Array dimensions of typbasetype */
15521573
false,/* Type NOT NULL */
1553-
InvalidOid);/* typcollation */
1574+
InvalidOid,/* typcollation */
1575+
F_ARRAY_SUBSCRIPTION);
15541576

15551577
pfree(rangeArrayName);
15561578

@@ -2248,6 +2270,7 @@ AlterDomainDefault(List *names, Node *defaultRaw)
22482270
false,/* a domain isn't an implicit array */
22492271
typTup->typbasetype,
22502272
typTup->typcollation,
2273+
typTup->typsubscription,
22512274
defaultExpr,
22522275
true);/* Rebuild is true */
22532276

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp