Skip to content

Commit ee6b1b1

Browse files
authored
Fix: get_ENR_withoid should also search through the parent queryEnvs to find if the ENR with given OID exists. (#665) (#690)
get_ENR_withoid previously only checked for the given OID within the provided queryEnv; however this function should be identical to getENR (as also suggested by the comment), which searches through parent envs as well. Hence, changing get_ENR_withoid to also search through parent queryEnvs We have introduced a similar recurse flag which will be turned off for most cases, except the necessary ones. NOTE: index and toast creation is still not correct as these relations get registered into the incorrect queryEnv. I've created a separate issue for it - BABEL-6272 and we will solve it next Extension PR: babelfish-for-postgresql/babelfish_extensions#4334 Tasks: BABEL-5605, BABEL-6192 (cherry picked from commit 354baf6) Signed-off-by: Ayush Shah <ayushdsh@amazon.com>
1 parent b15ead9 commit ee6b1b1

10 files changed

Lines changed: 46 additions & 39 deletions

File tree

src/backend/catalog/aclchk.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1835,7 +1835,7 @@ ExecGrant_Relation(InternalGrant *istmt)
18351835
Oid ownerId;
18361836
HeapTuple tuple;
18371837
ListCell *cell_colprivs;
1838-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relOid, ENR_TSQL_TEMP));
1838+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relOid, ENR_TSQL_TEMP, false));
18391839

18401840
if (is_enr)
18411841
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relOid));
@@ -2185,7 +2185,7 @@ ExecGrant_common(InternalGrant *istmt, Oid classid, AclMode default_privs,
21852185
int nnewmembers;
21862186
Oid *oldmembers;
21872187
Oid *newmembers;
2188-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, objectid, ENR_TSQL_TEMP));
2188+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, objectid, ENR_TSQL_TEMP, false));
21892189

21902190
if (is_enr)
21912191
tuple = SearchSysCache1(cacheid, ObjectIdGetDatum(objectid));

src/backend/catalog/index.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,7 @@ index_create(Relation heapRelation,
766766
* PRIMARY KEYs and/or CONSTRAINTs.
767767
*/
768768
is_enr = (indexRelationName && strlen(indexRelationName) > 0 &&
769-
(indexRelationName[0] == '@' || GetENRTempTableWithOid(heapRelationId)));
769+
(indexRelationName[0] == '@' || GetENRTempTableWithOid(heapRelationId, true)));
770770
}
771771

772772
relkind = partitioned ? RELKIND_PARTITIONED_INDEX : RELKIND_INDEX;

src/backend/catalog/toasting.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
202202
*/
203203
if (IsTsqlTableVariable(rel))
204204
pg_toast_prefix = "@pg_toast";
205-
else if (IsTsqlTempTable(rel->rd_rel->relpersistence) && GetENRTempTableWithOid(rel->rd_id))
205+
else if (IsTsqlTempTable(rel->rd_rel->relpersistence) && GetENRTempTableWithOid(rel->rd_id, true))
206206
pg_toast_prefix = "#pg_toast";
207207

208208
snprintf(toast_relname, sizeof(toast_relname),

src/backend/commands/cluster.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, Oid NewAccessMethod,
740740
* We also must ensure that these temp tables are properly named in TSQL
741741
* so that the metadata is properly cleaned up after in this function.
742742
*/
743-
if (IsTsqlTempTable(relpersistence) && GetENRTempTableWithOid(OIDOldHeap))
743+
if (IsTsqlTempTable(relpersistence) && GetENRTempTableWithOid(OIDOldHeap, false))
744744
snprintf(NewHeapName, sizeof(NewHeapName), "#pg_temp_%u", OIDOldHeap);
745745
else
746746
snprintf(NewHeapName, sizeof(NewHeapName), "pg_temp_%u", OIDOldHeap);
@@ -1614,7 +1614,7 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap,
16141614
/* rename the toast table ... */
16151615
if (IsTsqlTableVariable(newrel))
16161616
pg_toast_prefix = "@pg_toast";
1617-
else if (IsTsqlTempTable(newrel->rd_rel->relpersistence) && GetENRTempTableWithOid(newrel->rd_id))
1617+
else if (IsTsqlTempTable(newrel->rd_rel->relpersistence) && GetENRTempTableWithOid(newrel->rd_id, false))
16181618
pg_toast_prefix = "#pg_toast";
16191619

16201620
snprintf(NewToastName, NAMEDATALEN, "%s_%u",

src/backend/commands/dbcommands.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1887,7 +1887,7 @@ RenameDatabase(const char *oldname, const char *newname)
18871887
errdetail_busy_db(notherbackends, npreparedxacts)));
18881888

18891889
/* rename */
1890-
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, db_id, ENR_TSQL_TEMP));
1890+
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, db_id, ENR_TSQL_TEMP, false));
18911891
if (is_enr)
18921892
newtup = SearchSysCacheCopy1(DATABASEOID, ObjectIdGetDatum(db_id));
18931893
else

src/backend/commands/indexcmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4410,7 +4410,7 @@ update_relispartition(Oid relationId, bool newval)
44104410
HeapTuple tup;
44114411
Relation classRel;
44124412
ItemPointerData otid;
4413-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relationId, ENR_TSQL_TEMP));
4413+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relationId, ENR_TSQL_TEMP, false));
44144414

44154415
classRel = table_open(RelationRelationId, RowExclusiveLock);
44164416
if (is_enr)

src/backend/commands/tablecmds.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3543,7 +3543,7 @@ SetRelationTableSpace(Relation rel,
35433543
ItemPointerData otid;
35443544
Form_pg_class rd_rel;
35453545
Oid reloid = RelationGetRelid(rel);
3546-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, reloid, ENR_TSQL_TEMP));
3546+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, reloid, ENR_TSQL_TEMP, false));
35473547

35483548
Assert(CheckRelationTableSpaceMove(rel, newTableSpaceId));
35493549

@@ -4065,7 +4065,7 @@ RenameRelationInternal(Oid myrelid, const char *newrelname, bool is_internal, bo
40654065
HeapTuple reltup;
40664066
Form_pg_class relform;
40674067
Oid namespaceId;
4068-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, myrelid, ENR_TSQL_TEMP));
4068+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, myrelid, ENR_TSQL_TEMP, false));
40694069

40704070
/*
40714071
* Grab a lock on the target relation, which we will NOT release until end
@@ -14720,7 +14720,7 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
1472014720

1472114721
/* Fetch heap tuple */
1472214722
relid = RelationGetRelid(rel);
14723-
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relid, ENR_TSQL_TEMP));
14723+
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relid, ENR_TSQL_TEMP, false));
1472414724
if (is_enr)
1472514725
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
1472614726
else
@@ -16985,7 +16985,7 @@ AlterRelationNamespaceInternal(Relation classRel, Oid relOid,
1698516985
Form_pg_class classForm;
1698616986
ObjectAddress thisobj;
1698716987
bool already_done = false;
16988-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relOid, ENR_TSQL_TEMP));
16988+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relOid, ENR_TSQL_TEMP, false));
1698916989

1699016990
/* no rel lock for relkind=c so use LOCKTAG_TUPLE */
1699116991
if (is_enr)

src/backend/utils/cache/relcache.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3758,7 +3758,7 @@ RelationSetNewRelfilenumber(Relation relation, char persistence)
37583758
*/
37593759
pg_class = table_open(RelationRelationId, RowExclusiveLock);
37603760

3761-
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, RelationGetRelid(relation), ENR_TSQL_TEMP));
3761+
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, RelationGetRelid(relation), ENR_TSQL_TEMP, true));
37623762
if (is_enr)
37633763
tuple = SearchSysCacheCopy1(RELOID,
37643764
ObjectIdGetDatum(RelationGetRelid(relation)));

src/backend/utils/misc/queryenvironment.c

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ register_ENR(QueryEnvironment *queryEnv, EphemeralNamedRelation enr)
222222
* as false, same as parent since table variable don't follow transactional
223223
* semantics.
224224
*/
225-
EphemeralNamedRelation parent_enr = GetENRTempTableWithOid(enr->md.parent_oid);
225+
EphemeralNamedRelation parent_enr = GetENRTempTableWithOid(enr->md.parent_oid, true);
226226
if(parent_enr)
227227
enr->md.is_bbf_temp_table = parent_enr->md.is_bbf_temp_table;
228228
else
@@ -316,19 +316,26 @@ get_ENR(QueryEnvironment *queryEnv, const char *name, bool search)
316316
* Same as get_ENR() but just search for relation oid
317317
*/
318318
EphemeralNamedRelation
319-
get_ENR_withoid(QueryEnvironment *queryEnv, Oid id, EphemeralNameRelationType type)
319+
get_ENR_withoid(QueryEnvironment *queryEnv, Oid id, EphemeralNameRelationType type, bool recurse)
320320
{
321321
ListCell *lc;
322+
QueryEnvironment *qe = queryEnv;
322323

323324
if (queryEnv == NULL || !OidIsValid(id))
324325
return NULL;
325326

326-
foreach(lc, queryEnv->namedRelList)
327+
while (qe)
327328
{
328-
EphemeralNamedRelation enr = (EphemeralNamedRelation) lfirst(lc);
329+
foreach(lc, qe->namedRelList)
330+
{
331+
EphemeralNamedRelation enr = (EphemeralNamedRelation) lfirst(lc);
329332

330-
if (enr->md.reliddesc == id && enr->md.enrtype == type)
331-
return enr;
333+
if (enr->md.reliddesc == id && enr->md.enrtype == type)
334+
return enr;
335+
}
336+
if (!recurse)
337+
break;
338+
qe = qe->parentEnv;
332339
}
333340

334341
return NULL;
@@ -339,9 +346,9 @@ get_ENR_withoid(QueryEnvironment *queryEnv, Oid id, EphemeralNameRelationType ty
339346
* provided arguments of currentQueryEnv and ENR_TSQL_TEMP.
340347
*/
341348
EphemeralNamedRelation
342-
GetENRTempTableWithOid(Oid id)
349+
GetENRTempTableWithOid(Oid id, bool recurse)
343350
{
344-
return get_ENR_withoid(currentQueryEnv, id, ENR_TSQL_TEMP);
351+
return get_ENR_withoid(currentQueryEnv, id, ENR_TSQL_TEMP, recurse);
345352
}
346353

347354
/*
@@ -821,7 +828,7 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
821828
switch (catalog_oid) {
822829
case RelationRelationId:
823830
rel_oid = ((Form_pg_class) GETSTRUCT(tup))->oid;
824-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
831+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
825832
list_ptr = &enr->md.cattups[ENR_CATTUP_CLASS];
826833
lc = list_head(enr->md.cattups[ENR_CATTUP_CLASS]);
827834
ret = true;
@@ -883,7 +890,7 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
883890
{
884891
Form_pg_shdepend tf1 = (Form_pg_shdepend) GETSTRUCT((HeapTuple)tup);
885892
rel_oid = ((Form_pg_shdepend) GETSTRUCT(tup))->objid;
886-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
893+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
887894
ListCell *curlc;
888895
Form_pg_shdepend tf2; /* tuple forms*/
889896

@@ -916,7 +923,7 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
916923
}
917924
case IndexRelationId:
918925
rel_oid = ((Form_pg_index) GETSTRUCT(tup))->indrelid;
919-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
926+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
920927
list_ptr = &enr->md.cattups[ENR_CATTUP_INDEX];
921928
lc = list_head(enr->md.cattups[ENR_CATTUP_INDEX]);
922929
ret = true;
@@ -934,7 +941,7 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
934941
/* Composite type */
935942
if (((Form_pg_type) GETSTRUCT(tup))->typelem == InvalidOid) {
936943
rel_oid = ((Form_pg_type) GETSTRUCT(tup))->typrelid;
937-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
944+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
938945
list_ptr = &enr->md.cattups[ENR_CATTUP_TYPE];
939946
lc = list_head(enr->md.cattups[ENR_CATTUP_TYPE]);
940947
ret = true;
@@ -970,7 +977,7 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
970977
break;
971978
case AttributeRelationId:
972979
rel_oid = ((Form_pg_attribute) GETSTRUCT(tup))->attrelid;
973-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
980+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
974981
ListCell *curlc;
975982
Form_pg_attribute tf1, tf2; /* tuple forms*/
976983

@@ -997,7 +1004,7 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
9971004
break;
9981005
case ConstraintRelationId:
9991006
rel_oid = ((Form_pg_constraint) GETSTRUCT(tup))->conrelid;
1000-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
1007+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
10011008
Form_pg_constraint tf1, tf2; /* tuple forms*/
10021009
ListCell *curlc;
10031010

@@ -1016,7 +1023,7 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
10161023
break;
10171024
case StatisticRelationId:
10181025
rel_oid = ((Form_pg_statistic) GETSTRUCT(tup))->starelid;
1019-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
1026+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
10201027
Form_pg_statistic tf1, tf2; /* tuple forms*/
10211028
ListCell *curlc;
10221029

@@ -1035,7 +1042,7 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
10351042
break;
10361043
case StatisticExtRelationId:
10371044
rel_oid = ((Form_pg_statistic_ext) GETSTRUCT(tup))->stxrelid;
1038-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
1045+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
10391046
Form_pg_statistic_ext tf1, tf2; /* tuple forms*/
10401047
ListCell *curlc;
10411048

@@ -1054,15 +1061,15 @@ static bool _ENR_tuple_operation(Relation catalog_rel, HeapTuple tup, ENRTupleOp
10541061
break;
10551062
case SequenceRelationId:
10561063
rel_oid = ((Form_pg_sequence) GETSTRUCT(tup))->seqrelid;
1057-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
1064+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
10581065
list_ptr = &enr->md.cattups[ENR_CATTUP_SEQUENCE];
10591066
lc = list_head(enr->md.cattups[ENR_CATTUP_SEQUENCE]);
10601067
ret = true;
10611068
}
10621069
break;
10631070
case AttrDefaultRelationId:
10641071
rel_oid = ((Form_pg_attrdef) GETSTRUCT(tup))->adrelid;
1065-
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP))) {
1072+
if ((enr = get_ENR_withoid(queryEnv, rel_oid, ENR_TSQL_TEMP, false))) {
10661073
list_ptr = &enr->md.cattups[ENR_CATTUP_ATTR_DEF_REL];
10671074
lc = list_head(enr->md.cattups[ENR_CATTUP_ATTR_DEF_REL]);
10681075
ret = true;
@@ -1143,7 +1150,7 @@ static EphemeralNamedRelation find_enr(Form_pg_depend entry)
11431150
* to register the dependency of the ENR relation to this object.
11441151
*/
11451152
case RelationRelationId:
1146-
return get_ENR_withoid(queryEnv, entry->objid, ENR_TSQL_TEMP);
1153+
return get_ENR_withoid(queryEnv, entry->objid, ENR_TSQL_TEMP, false);
11471154

11481155
case TypeRelationId:
11491156
foreach(curlc, queryEnv->namedRelList) {
@@ -1171,7 +1178,7 @@ static EphemeralNamedRelation find_enr(Form_pg_depend entry)
11711178

11721179
case ConstraintRelationId:
11731180
case AttrDefaultRelationId:
1174-
return get_ENR_withoid(queryEnv, entry->refobjid, ENR_TSQL_TEMP);
1181+
return get_ENR_withoid(queryEnv, entry->refobjid, ENR_TSQL_TEMP, false);
11751182

11761183
default:
11771184
break;
@@ -1192,7 +1199,7 @@ void ENRDropEntry(Oid id)
11921199
if (sql_dialect != SQL_DIALECT_TSQL || !currentQueryEnv)
11931200
return;
11941201

1195-
if ((enr = GetENRTempTableWithOid(id)) == NULL)
1202+
if ((enr = GetENRTempTableWithOid(id, false)) == NULL)
11961203
return;
11971204

11981205
oldcxt = MemoryContextSwitchTo(currentQueryEnv->memctx);
@@ -1313,7 +1320,7 @@ void ENRDropCatalogEntry(Relation catalog_relation, Oid relid)
13131320
{
13141321
switch (catalog_oid) {
13151322
case AttributeRelationId:
1316-
if ((enr = get_ENR_withoid(queryEnv, relid, ENR_TSQL_TEMP))) {
1323+
if ((enr = get_ENR_withoid(queryEnv, relid, ENR_TSQL_TEMP, false))) {
13171324
list_ptr = &enr->md.cattups[ENR_CATTUP_ATTRIBUTE];
13181325
ret = true;
13191326
}
@@ -1706,7 +1713,7 @@ ENRRollbackUncommittedTuple(QueryEnvironment *queryEnv, ENRUncommittedTuple unco
17061713
*/
17071714

17081715
Form_pg_index idx_form = (Form_pg_index) GETSTRUCT(uncommitted_tup->tup);
1709-
if (get_ENR_withoid(queryEnv, idx_form->indrelid, ENR_TSQL_TEMP))
1716+
if (get_ENR_withoid(queryEnv, idx_form->indrelid, ENR_TSQL_TEMP, false))
17101717
{
17111718
skip_cache_inval = true;
17121719
}
@@ -1838,7 +1845,7 @@ bool UseTempOidBuffer()
18381845
bool UseTempOidBufferForOid(Oid relId)
18391846
{
18401847
return UseTempOidBuffer()
1841-
&& GetENRTempTableWithOid(relId);
1848+
&& GetENRTempTableWithOid(relId, false);
18421849
}
18431850

18441851
bool has_existing_enr_relations()

src/include/utils/queryenvironment.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ extern void register_ENR(QueryEnvironment *queryEnv, EphemeralNamedRelation enr)
137137
extern void unregister_ENR(QueryEnvironment *queryEnv, const char *name);
138138
extern PGDLLEXPORT List *get_namedRelList(void);
139139
extern EphemeralNamedRelation get_ENR(QueryEnvironment *queryEnv, const char *name, bool search);
140-
extern PGDLLEXPORT EphemeralNamedRelation get_ENR_withoid(QueryEnvironment *queryEnv, Oid oid, EphemeralNameRelationType type);
141-
extern EphemeralNamedRelation GetENRTempTableWithOid(Oid id);
140+
extern PGDLLEXPORT EphemeralNamedRelation get_ENR_withoid(QueryEnvironment *queryEnv, Oid oid, EphemeralNameRelationType type, bool recurse);
141+
extern EphemeralNamedRelation GetENRTempTableWithOid(Oid id, bool recurse);
142142
extern TupleDesc ENRMetadataGetTupDesc(EphemeralNamedRelationMetadata enrmd);
143143
extern bool ENRGetSystableScan(Relation rel, Oid indexoid, int nkeys, ScanKey key, List **tuplist, int *tuplist_i, int *tuplist_flags);
144144
extern bool ENRAddTuple(Relation rel, HeapTuple tup);

0 commit comments

Comments
 (0)