Skip to content

Commit 354baf6

Browse files
authored
Fix: get_ENR_withoid should also search through the parent queryEnvs to find if the ENR with given OID exists. (babelfish-for-postgresql#665)
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 Signed-off-by: Ayush Shah <ayushdsh@amazon.com>
1 parent 8812b0b commit 354baf6

File tree

10 files changed

+46
-39
lines changed

10 files changed

+46
-39
lines changed

src/backend/catalog/aclchk.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1856,7 +1856,7 @@ ExecGrant_Relation(InternalGrant *istmt)
18561856
Oid ownerId;
18571857
HeapTuple tuple;
18581858
ListCell *cell_colprivs;
1859-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relOid, ENR_TSQL_TEMP));
1859+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relOid, ENR_TSQL_TEMP, false));
18601860

18611861
if (is_enr)
18621862
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relOid));
@@ -2206,7 +2206,7 @@ ExecGrant_common(InternalGrant *istmt, Oid classid, AclMode default_privs,
22062206
int nnewmembers;
22072207
Oid *oldmembers;
22082208
Oid *newmembers;
2209-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, objectid, ENR_TSQL_TEMP));
2209+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, objectid, ENR_TSQL_TEMP, false));
22102210

22112211

22122212
if (is_enr)

src/backend/catalog/index.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ index_create(Relation heapRelation,
778778
* PRIMARY KEYs and/or CONSTRAINTs.
779779
*/
780780
is_enr = (indexRelationName && strlen(indexRelationName) > 0 &&
781-
(indexRelationName[0] == '@' || GetENRTempTableWithOid(heapRelationId)));
781+
(indexRelationName[0] == '@' || GetENRTempTableWithOid(heapRelationId, true)));
782782
}
783783

784784
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
@@ -198,7 +198,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
198198
*/
199199
if (IsTsqlTableVariable(rel))
200200
pg_toast_prefix = "@pg_toast";
201-
else if (IsTsqlTempTable(rel->rd_rel->relpersistence) && GetENRTempTableWithOid(rel->rd_id))
201+
else if (IsTsqlTempTable(rel->rd_rel->relpersistence) && GetENRTempTableWithOid(rel->rd_id, true))
202202
pg_toast_prefix = "#pg_toast";
203203

204204
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);
@@ -1601,7 +1601,7 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap,
16011601
/* rename the toast table ... */
16021602
if (IsTsqlTableVariable(newrel))
16031603
pg_toast_prefix = "@pg_toast";
1604-
else if (IsTsqlTempTable(newrel->rd_rel->relpersistence) && GetENRTempTableWithOid(newrel->rd_id))
1604+
else if (IsTsqlTempTable(newrel->rd_rel->relpersistence) && GetENRTempTableWithOid(newrel->rd_id, false))
16051605
pg_toast_prefix = "#pg_toast";
16061606

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

src/backend/commands/dbcommands.c

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

19401940
/* rename */
1941-
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, db_id, ENR_TSQL_TEMP));
1941+
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, db_id, ENR_TSQL_TEMP, false));
19421942
if (is_enr)
19431943
newtup = SearchSysCacheCopy1(DATABASEOID, ObjectIdGetDatum(db_id));
19441944
else

src/backend/commands/indexcmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4440,7 +4440,7 @@ update_relispartition(Oid relationId, bool newval)
44404440
HeapTuple tup;
44414441
Relation classRel;
44424442
ItemPointerData otid;
4443-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relationId, ENR_TSQL_TEMP));
4443+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relationId, ENR_TSQL_TEMP, false));
44444444

44454445
classRel = table_open(RelationRelationId, RowExclusiveLock);
44464446
if (is_enr)

src/backend/commands/tablecmds.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3697,7 +3697,7 @@ SetRelationTableSpace(Relation rel,
36973697
ItemPointerData otid;
36983698
Form_pg_class rd_rel;
36993699
Oid reloid = RelationGetRelid(rel);
3700-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, reloid, ENR_TSQL_TEMP));
3700+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, reloid, ENR_TSQL_TEMP, false));
37013701

37023702
Assert(CheckRelationTableSpaceMove(rel, newTableSpaceId));
37033703

@@ -4219,7 +4219,7 @@ RenameRelationInternal(Oid myrelid, const char *newrelname, bool is_internal, bo
42194219
HeapTuple reltup;
42204220
Form_pg_class relform;
42214221
Oid namespaceId;
4222-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, myrelid, ENR_TSQL_TEMP));
4222+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, myrelid, ENR_TSQL_TEMP, false));
42234223

42244224
/*
42254225
* Grab a lock on the target relation, which we will NOT release until end
@@ -15188,7 +15188,7 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
1518815188

1518915189
/* Fetch heap tuple */
1519015190
relid = RelationGetRelid(rel);
15191-
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relid, ENR_TSQL_TEMP));
15191+
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relid, ENR_TSQL_TEMP, false));
1519215192
if (is_enr)
1519315193
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
1519415194
else
@@ -17446,7 +17446,7 @@ AlterRelationNamespaceInternal(Relation classRel, Oid relOid,
1744617446
Form_pg_class classForm;
1744717447
ObjectAddress thisobj;
1744817448
bool already_done = false;
17449-
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relOid, ENR_TSQL_TEMP));
17449+
bool is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, relOid, ENR_TSQL_TEMP, false));
1745017450

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

src/backend/utils/cache/relcache.c

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

3819-
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, RelationGetRelid(relation), ENR_TSQL_TEMP));
3819+
is_enr = (sql_dialect == SQL_DIALECT_TSQL && get_ENR_withoid(currentQueryEnv, RelationGetRelid(relation), ENR_TSQL_TEMP, true));
38203820
if (is_enr)
38213821
tuple = SearchSysCacheCopy1(RELOID,
38223822
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)