Skip to content

Commit

Permalink
Support GPDB 7 append optimized table DDL
Browse files Browse the repository at this point in the history
In GPDB 7+, the usual way of creating append optimized tables has been
deprecated. We need to add a GPDB version check and use the new DDL
syntax for append optimized tables.

Authored-by: Kevin Yeap <kyeap@vmware.com>
  • Loading branch information
kyeap-vmware authored and AJR-VMware committed Nov 22, 2022
1 parent 1e2559c commit 0c7ec12
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
3 changes: 3 additions & 0 deletions backup/predata_relations.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ func PrintRegularTableCreateStatement(metadataFile *utils.FileWithByteCount, toc
metadataFile.MustPrintf("OPTIONS (%s) ", table.ForeignDef.Options)
}
}
if table.AccessMethodName != "" {
metadataFile.MustPrintf("USING %s ", table.AccessMethodName)
}
if table.StorageOpts != "" {
metadataFile.MustPrintf("WITH (%s) ", table.StorageOpts)
}
Expand Down
16 changes: 16 additions & 0 deletions backup/queries_table_defs.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ type TableDefinition struct {
Inherits []string
ReplicaIdentity string
PartitionAlteredSchemas []AlteredPartitionRelation
AccessMethodName string
}

/*
Expand All @@ -90,6 +91,7 @@ func ConstructDefinitionsForTables(connectionPool *dbconn.DBConn, tableRelations
extTableDefs := GetExternalTableDefinitions(connectionPool)
partTableMap := GetPartitionTableMap(connectionPool)
tableTypeMap := GetTableType(connectionPool)
accessMethodMap := GetTableAccessMethod(connectionPool)
unloggedTableMap := GetUnloggedTables(connectionPool)
foreignTableDefs := GetForeignTableDefinitions(connectionPool)
inheritanceMap := GetTableInheritance(connectionPool, tableRelations)
Expand All @@ -115,6 +117,7 @@ func ConstructDefinitionsForTables(connectionPool *dbconn.DBConn, tableRelations
Inherits: inheritanceMap[oid],
ReplicaIdentity: replicaIdentityMap[oid],
PartitionAlteredSchemas: partitionAlteredSchemaMap[oid],
AccessMethodName: accessMethodMap[oid],
}
if tableDef.Inherits == nil {
tableDef.Inherits = []string{}
Expand Down Expand Up @@ -321,6 +324,19 @@ func GetTableType(connectionPool *dbconn.DBConn) map[uint32]string {
return selectAsOidToStringMap(connectionPool, query)
}

func GetTableAccessMethod(connectionPool *dbconn.DBConn) map[uint32]string {
if connectionPool.Version.Before("7") {
return map[uint32]string{}
}
query := `
SELECT c.oid, a.amname AS value
FROM pg_class c
JOIN pg_am a ON c.relam = a.oid
WHERE a.amtype = 't'
AND a.amname != 'heap';`
return selectAsOidToStringMap(connectionPool, query)
}

func GetTableReplicaIdentity(connectionPool *dbconn.DBConn) map[uint32]string {
if connectionPool.Version.Before("6") {
return map[uint32]string{}
Expand Down
11 changes: 11 additions & 0 deletions integration/predata_relations_create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,17 @@ var _ = Describe("backup integration create statement tests", func() {
resultTable := backup.ConstructDefinitionsForTables(connectionPool, []backup.Relation{testTable.Relation})[0]
structmatcher.ExpectStructsToMatchExcluding(testTable.TableDefinition, resultTable.TableDefinition, "ColumnDefs.Oid", "ExtTableDef")
})
It("creates a basic GPDB 7+ append-optimized table", func() {
testutils.SkipIfBefore7(connectionPool)
testTable.TableDefinition.AccessMethodName = "ao_column"

backup.PrintRegularTableCreateStatement(backupfile, tocfile, testTable)

testhelper.AssertQueryRuns(connectionPool, buffer.String())
testTable.Oid = testutils.OidFromObjectName(connectionPool, "public", "testtable", backup.TYPE_RELATION)
resultTable := backup.ConstructDefinitionsForTables(connectionPool, []backup.Relation{testTable.Relation})[0]
structmatcher.ExpectStructsToMatchExcluding(testTable.TableDefinition, resultTable.TableDefinition, "ColumnDefs.Oid", "ExtTableDef")
})
It("creates a one-level partition table", func() {
rowOne := backup.ColumnDefinition{Oid: 0, Num: 1, Name: "region", NotNull: false, HasDefault: false, Type: "text", Encoding: "", StatTarget: -1, StorageType: "", DefaultVal: "", Comment: ""}
rowTwo := backup.ColumnDefinition{Oid: 0, Num: 2, Name: "gender", NotNull: false, HasDefault: false, Type: "text", Encoding: "", StatTarget: -1, StorageType: "", DefaultVal: "", Comment: ""}
Expand Down

0 comments on commit 0c7ec12

Please sign in to comment.