| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /*------------------------------------------------------------------------- |
| * |
| * cdbdirectopen.h |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #ifndef CDBDIRECTOPEN_H |
| #define CDBDIRECTOPEN_H |
| |
| #include "postgres.h" |
| #include "miscadmin.h" |
| #include "pgstat.h" |
| #include "utils/palloc.h" |
| #include "storage/fd.h" |
| #include "storage/relfilenode.h" |
| |
| #include "catalog/catalog.h" |
| #include "catalog/pg_namespace.h" |
| #include "catalog/pg_authid.h" |
| #include "catalog/pg_tablespace.h" |
| #include "catalog/pg_class.h" |
| #include "catalog/gp_persistent.h" |
| #include "catalog/gp_global_sequence.h" |
| #include "catalog/pg_appendonly.h" |
| #include "catalog/index.h" |
| #include "access/transam.h" |
| #include "access/aosegfiles.h" |
| |
| /* |
| * The goal here is to open any relations without going through |
| * pg_class or the pg_class indices. |
| * |
| * This allows us to handle relation CREATEs and DROPs |
| * before XLOG recovery is complete, allows an REINDEX INDEX pg_class_oid_index |
| * command to complete successfully, and more. |
| */ |
| |
| typedef struct DirectOpen |
| { |
| bool isInit; |
| |
| struct tupleConstr constrData; |
| |
| struct tupleDesc descData; |
| |
| PgStat_TableStatus pgStat; |
| |
| RelationData relationData; |
| |
| } DirectOpen; |
| |
| // HUGE MAGIC DEFINE creates static variables with values for DirectOpen_Open. |
| // Class tuple values, |
| // Schema (i.e. pg_attribute) values and array, |
| // |
| // There can only be ONE instance of a kind of open per process (backend). |
| // |
| // IMPORTANT: Arrange to share the ONE instance globally. |
| // IMPORTANT: Use the *Static define in the .c file and the *Extern define in the .h. |
| // |
| #define DirectOpenDefineStatic(name,pgClassStatic,attrArrayStatic,relHasOid) \ |
| \ |
| static FormData_pg_class *name##RelPgClass = &pgClassStatic; \ |
| static FormData_pg_attribute *name##RelAttrArray = attrArrayStatic; \ |
| static bool name##RelHasOid = relHasOid; \ |
| \ |
| static DirectOpen name##RelDirectOpen; \ |
| \ |
| Relation name##OpenShared(void) \ |
| { \ |
| return DirectOpen_Open( \ |
| &name##RelDirectOpen, \ |
| -1, \ |
| GLOBALTABLESPACE_OID, \ |
| 0, \ |
| -1, \ |
| name##RelPgClass, \ |
| name##RelAttrArray, \ |
| NULL, \ |
| NULL, \ |
| NULL, \ |
| NULL, \ |
| name##RelHasOid); \ |
| } \ |
| \ |
| Relation name##Open( \ |
| Oid tablespace, \ |
| Oid database) \ |
| { \ |
| return DirectOpen_Open( \ |
| &name##RelDirectOpen, \ |
| -1, \ |
| tablespace, \ |
| database, \ |
| -1, \ |
| name##RelPgClass, \ |
| name##RelAttrArray, \ |
| NULL, \ |
| NULL, \ |
| NULL, \ |
| NULL, \ |
| name##RelHasOid); \ |
| } \ |
| \ |
| Relation name##OpenDynamic( \ |
| Oid relationId, \ |
| Oid tablespace, \ |
| Oid database, \ |
| Oid relfilenode) \ |
| { \ |
| return DirectOpen_Open( \ |
| &name##RelDirectOpen, \ |
| relationId, \ |
| tablespace, \ |
| database, \ |
| relfilenode, \ |
| name##RelPgClass, \ |
| name##RelAttrArray, \ |
| NULL, \ |
| NULL, \ |
| NULL, \ |
| NULL, \ |
| name##RelHasOid); \ |
| } \ |
| \ |
| void name##Close(Relation relation) \ |
| { \ |
| return DirectOpen_Close( \ |
| &name##RelDirectOpen, \ |
| relation); \ |
| } \ |
| \ |
| |
| |
| #define DirectOpenDefineExtern(name) \ |
| \ |
| extern Relation name##OpenShared(void); \ |
| \ |
| extern Relation name##Open( \ |
| Oid tablespace, \ |
| Oid database); \ |
| \ |
| extern Relation name##OpenDynamic( \ |
| Oid relationId, \ |
| Oid tablespace, \ |
| Oid database, \ |
| Oid relfilenode); \ |
| \ |
| extern void name##Close(Relation relation); |
| |
| DirectOpenDefineExtern(DirectOpen_PgClass); |
| |
| DirectOpenDefineExtern(DirectOpen_PgExtTable); |
| |
| DirectOpenDefineExtern(DirectOpen_PgNameSpace); |
| |
| DirectOpenDefineExtern(DirectOpen_GpRelfileNode); |
| |
| DirectOpenDefineExtern(DirectOpen_PgAppendOnly); |
| |
| DirectOpenDefineExtern(DirectOpen_PgParquet); |
| |
| DirectOpenDefineExtern(DirectOpen_PgAoSeg); |
| |
| DirectOpenDefineExtern(DirectOpen_GpGlobalSequence); |
| |
| DirectOpenDefineExtern(DirectOpen_GpPersistentRelfileNode); |
| |
| DirectOpenDefineExtern(DirectOpen_GpPersistentRelationNode); |
| |
| DirectOpenDefineExtern(DirectOpen_GpPersistentDatabaseNode); |
| |
| DirectOpenDefineExtern(DirectOpen_GpPersistentTableSpaceNode); |
| |
| DirectOpenDefineExtern(DirectOpen_GpPersistentFileSpaceNode); |
| |
| // INDEX Variant |
| // |
| // HUGE MAGIC DEFINE creates static variables with values for DirectOpen_Open. |
| // Class tuple values, |
| // Schema (i.e. pg_attribute) values and array, |
| // |
| // There can only be ONE instance of a kind of open per process (backend). |
| // |
| // IMPORTANT: Arrange to share the ONE instance globally. |
| // IMPORTANT: Use the *Static define in the .c file and the *Extern define in the .h. |
| // |
| #define DirectOpenIndexDefineStatic(name,pgClassStatic,attrArrayStatic,pgAmStatic,pgIndexStatic,indKeyArray,indClassArray,relHasOid) \ |
| \ |
| static FormData_pg_class *name##RelPgClass = &pgClassStatic; \ |
| static FormData_pg_attribute *name##RelAttrArray = attrArrayStatic; \ |
| static FormData_pg_am *name##RelPgAm = &pgAmStatic; \ |
| static FormData_pg_index *name##RelPgIndex = &pgIndexStatic; \ |
| static int2 *name##RelIndKeyArray = indKeyArray; \ |
| static Oid *name##RelIndClassArray = indClassArray; \ |
| static bool name##RelHasOid = relHasOid; \ |
| \ |
| static DirectOpen name##RelDirectOpen; \ |
| \ |
| Relation name##OpenShared(void) \ |
| { \ |
| return DirectOpen_Open( \ |
| &name##RelDirectOpen, \ |
| -1, \ |
| GLOBALTABLESPACE_OID, \ |
| 0, \ |
| -1, \ |
| name##RelPgClass, \ |
| name##RelAttrArray, \ |
| name##RelPgAm, \ |
| name##RelPgIndex, \ |
| name##RelIndKeyArray, \ |
| name##RelIndClassArray, \ |
| name##RelHasOid); \ |
| } \ |
| \ |
| Relation name##Open( \ |
| Oid tablespace, \ |
| Oid database) \ |
| { \ |
| return DirectOpen_Open( \ |
| &name##RelDirectOpen, \ |
| -1, \ |
| tablespace, \ |
| database, \ |
| -1, \ |
| name##RelPgClass, \ |
| name##RelAttrArray, \ |
| name##RelPgAm, \ |
| name##RelPgIndex, \ |
| name##RelIndKeyArray, \ |
| name##RelIndClassArray, \ |
| name##RelHasOid); \ |
| } \ |
| \ |
| Relation name##OpenDynamic( \ |
| Oid relationId, \ |
| Oid tablespace, \ |
| Oid database, \ |
| Oid relfilenode) \ |
| { \ |
| return DirectOpen_Open( \ |
| &name##RelDirectOpen, \ |
| relationId, \ |
| tablespace, \ |
| database, \ |
| relfilenode, \ |
| name##RelPgClass, \ |
| name##RelAttrArray, \ |
| name##RelPgAm, \ |
| name##RelPgIndex, \ |
| name##RelIndKeyArray, \ |
| name##RelIndClassArray, \ |
| name##RelHasOid); \ |
| } \ |
| \ |
| void name##Close(Relation relation) \ |
| { \ |
| return DirectOpen_Close( \ |
| &name##RelDirectOpen, \ |
| relation); \ |
| } \ |
| \ |
| |
| |
| #define DirectOpenIndexDefineExtern(name) \ |
| \ |
| extern Relation name##OpenShared(void); \ |
| \ |
| extern Relation name##Open( \ |
| Oid tablespace, \ |
| Oid database); \ |
| \ |
| extern Relation name##OpenDynamic( \ |
| Oid relationId, \ |
| Oid tablespace, \ |
| Oid database, \ |
| Oid relfilenode); \ |
| \ |
| extern void name##Close(Relation relation); |
| |
| DirectOpenIndexDefineExtern(DirectOpen_GpRelfileNodeIndex); |
| |
| extern Relation DirectOpen_Open( |
| DirectOpen *direct, |
| |
| Oid relationId, |
| |
| Oid tablespace, |
| |
| Oid database, |
| |
| Oid relfilenode, |
| |
| FormData_pg_class *pgClass, |
| |
| FormData_pg_attribute *attrArray, |
| |
| FormData_pg_am *pgAm, |
| |
| FormData_pg_index *pgIndex, |
| |
| int2 *indKeyArray, |
| |
| Oid *indClassArray, |
| |
| bool relHasOid); |
| |
| |
| extern void DirectOpen_Close( |
| DirectOpen *direct, |
| |
| Relation rel); |
| |
| #endif /* CDBDIRECTOPEN_H */ |