From 1caad70cae3498e243dfd8d2b5eddfaee18720e8 Mon Sep 17 00:00:00 2001 From: bplunkett-stripe Date: Tue, 10 Dec 2024 17:24:42 -0800 Subject: [PATCH 1/4] add support for postgres17 --- .github/workflows/run-tests.yaml | 12 ++++++-- README.md | 2 +- build/Dockerfile.test | 5 ++-- internal/queries/queries.sql | 48 +++++++++++++------------------- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/.github/workflows/run-tests.yaml b/.github/workflows/run-tests.yaml index 11d38bf..ef7c643 100644 --- a/.github/workflows/run-tests.yaml +++ b/.github/workflows/run-tests.yaml @@ -10,11 +10,19 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - pg_package: ["postgresql14", "postgresql15", "postgresql16"] + include: + - base_image: "golang:1.20.14-alpine3.19" + pg_package: "postgresql14" + - base_image: "golang:1.20.14-alpine3.19" + pg_package: "postgresql15" + - base_image: "golang:1.20.14-alpine3.19" + pg_package: "postgresql16" + - base_image: "golang:1.22.10-alpine3.21" + pg_package: "postgresql17" steps: - name: Checkout code uses: actions/checkout@v3 - name: Build Docker image - run: docker build -t pg-schema-diff-test-runner -f ./build/Dockerfile.test --build-arg POSTGRES_PACKAGE=${{ matrix.pg_package }} . + run: docker build -t pg-schema-diff-test-runner -f ./build/Dockerfile.test --build-arg BASE_IMAGE=${{ matrix.base_image }} --build-arg POSTGRES_PACKAGE=${{ matrix.pg_package }} . - name: Run tests run: docker run pg-schema-diff-test-runner diff --git a/README.md b/README.md index 01074d8..f847ccc 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ for _, stmt := range plan.Statements { ``` # Supported Postgres versions -Supported: 14, 15, 16 +Supported: 14, 15, 16, 17 Unsupported: <= 13 are not supported. Use at your own risk. # Unsupported migrations diff --git a/build/Dockerfile.test b/build/Dockerfile.test index 8fd9a28..2be696e 100644 --- a/build/Dockerfile.test +++ b/build/Dockerfile.test @@ -1,7 +1,8 @@ -FROM golang:1.20.14-alpine3.19 +ARG BASE_IMAGE=golang:1.20.14-alpine3.19 -ARG POSTGRES_PACKAGE=postgresql14 +FROM $BASE_IMAGE +ARG POSTGRES_PACKAGE=postgresql14 RUN apk update && \ apk add --no-cache \ build-base \ diff --git a/internal/queries/queries.sql b/internal/queries/queries.sql index 8f9c758..8a1ea69 100644 --- a/internal/queries/queries.sql +++ b/internal/queries/queries.sql @@ -17,7 +17,7 @@ WHERE -- name: GetTables :many SELECT - c.oid, + c.oid AS oid, c.relname::TEXT AS table_name, table_namespace.nspname::TEXT AS table_schema_name, c.relreplident::TEXT AS replica_identity, @@ -40,7 +40,7 @@ INNER JOIN ON c.relnamespace = table_namespace.oid LEFT JOIN pg_catalog.pg_inherits AS table_inherits - ON c.oid = table_inherits.inhrelid + ON table_inherits.inhrelid = c.oid LEFT JOIN pg_catalog.pg_class AS parent_c ON table_inherits.inhparent = parent_c.oid @@ -98,16 +98,16 @@ SELECT FROM pg_catalog.pg_attribute AS a LEFT JOIN pg_catalog.pg_attrdef AS d - ON (a.attrelid = d.adrelid AND a.attnum = d.adnum) -LEFT JOIN pg_catalog.pg_collation AS coll ON a.attcollation = coll.oid + ON (d.adrelid = a.attrelid AND d.adnum = a.attnum) +LEFT JOIN pg_catalog.pg_collation AS coll ON coll.oid = a.attcollation LEFT JOIN pg_catalog.pg_namespace AS collation_namespace - ON coll.collnamespace = collation_namespace.oid + ON collation_namespace.oid = coll.collnamespace LEFT JOIN identity_col_seq ON - a.attrelid = identity_col_seq.owner_relid - AND a.attnum = identity_col_seq.owner_attnum + identity_col_seq.owner_relid = a.attrelid + AND identity_col_seq.owner_attnum = a.attnum WHERE a.attrelid = $1 AND a.attnum > 0 @@ -116,7 +116,7 @@ ORDER BY a.attnum; -- name: GetIndexes :many SELECT - c.oid, + c.oid AS oid, c.relname::TEXT AS index_name, table_c.relname::TEXT AS table_name, table_namespace.nspname::TEXT AS table_schema_name, @@ -132,25 +132,21 @@ SELECT COALESCE(parent_c.relname, '')::TEXT AS parent_index_name, COALESCE(parent_namespace.nspname, '')::TEXT AS parent_index_schema_name, ( - SELECT - ARRAY_AGG( - att.attname - ORDER BY indkey_ord.ord - ) + SELECT ARRAY_AGG(att.attname ORDER BY indkey_ord.ord) FROM UNNEST(i.indkey) WITH ORDINALITY AS indkey_ord (attnum, ord) INNER JOIN pg_catalog.pg_attribute AS att - ON att.attrelid = table_c.oid AND indkey_ord.attnum = att.attnum + ON att.attrelid = table_c.oid AND att.attnum = indkey_ord.attnum )::TEXT [] AS column_names, COALESCE(con.conislocal, false) AS constraint_is_local FROM pg_catalog.pg_class AS c -INNER JOIN pg_catalog.pg_index AS i ON (c.oid = i.indexrelid) -INNER JOIN pg_catalog.pg_class AS table_c ON (i.indrelid = table_c.oid) +INNER JOIN pg_catalog.pg_index AS i ON (i.indexrelid = c.oid) +INNER JOIN pg_catalog.pg_class AS table_c ON (table_c.oid = i.indrelid) INNER JOIN pg_catalog.pg_namespace AS table_namespace ON table_c.relnamespace = table_namespace.oid LEFT JOIN pg_catalog.pg_constraint AS con - ON (c.oid = con.conindid AND con.contype IN ('p', 'u', null)) + ON (con.conindid = c.oid AND con.contype IN ('p', 'u', null)) LEFT JOIN pg_catalog.pg_inherits AS idx_inherits ON (c.oid = idx_inherits.inhrelid) @@ -226,7 +222,7 @@ WHERE AND pg_constraint.contype = 'f' AND pg_constraint.conislocal; --- name: GetProcs :many +-- name: GetFunctions :many SELECT pg_proc.oid, pg_proc.proname::TEXT AS func_name, @@ -242,12 +238,12 @@ INNER JOIN ON pg_proc.pronamespace = proc_namespace.oid INNER JOIN pg_catalog.pg_language AS proc_lang - ON pg_proc.prolang = proc_lang.oid + ON proc_lang.oid = pg_proc.prolang WHERE proc_namespace.nspname NOT IN ('pg_catalog', 'information_schema') AND proc_namespace.nspname !~ '^pg_toast' AND proc_namespace.nspname !~ '^pg_temp' - AND pg_proc.prokind = $1 + AND pg_proc.prokind = 'f' -- Exclude functions belonging to extensions AND NOT EXISTS ( SELECT depend.objid @@ -362,7 +358,7 @@ SELECT FROM pg_catalog.pg_namespace AS extension_namespace INNER JOIN pg_catalog.pg_extension AS ext - ON extension_namespace.oid = ext.extnamespace + ON ext.extnamespace = extension_namespace.oid WHERE extension_namespace.nspname NOT IN ('pg_catalog', 'information_schema') AND extension_namespace.nspname !~ '^pg_toast' @@ -374,18 +370,14 @@ SELECT pg_type.typname::TEXT AS enum_name, type_namespace.nspname::TEXT AS enum_schema_name, ( - SELECT - ARRAY_AGG( - pg_enum.enumlabel - ORDER BY pg_enum.enumsortorder - ) + SELECT ARRAY_AGG(pg_enum.enumlabel ORDER BY pg_enum.enumsortorder) FROM pg_catalog.pg_enum WHERE pg_enum.enumtypid = pg_type.oid )::TEXT [] AS enum_labels FROM pg_catalog.pg_type AS pg_type INNER JOIN pg_catalog.pg_namespace AS type_namespace - ON pg_type.typnamespace = type_namespace.oid + ON type_namespace.oid = pg_type.typnamespace WHERE pg_type.typtype = 'e' AND type_namespace.nspname NOT IN ('pg_catalog', 'information_schema') @@ -422,7 +414,7 @@ SELECT table_namespace.nspname::TEXT AS owning_table_schema_name, pol.polpermissive AS is_permissive, ( - SELECT ARRAY_AGG(roles.rolname) + SELECT ARRAY_AGG(rolname) FROM roles WHERE roles.oid = ANY(pol.polroles) )::TEXT [] AS applies_to, From 067933d5ca6244aae647aee4aa78a076c1c699d3 Mon Sep 17 00:00:00 2001 From: bplunkett-stripe Date: Tue, 10 Dec 2024 17:29:01 -0800 Subject: [PATCH 2/4] Run gofmt --- .golangci.yaml | 1 + internal/graph/graph.go | 2 +- internal/graph/graph_test.go | 4 ++-- internal/migration_acceptance_tests/sequence_cases_test.go | 2 +- internal/queries/queries.sql | 2 +- pkg/diff/sql_generator.go | 2 +- pkg/diff/transform_diff.go | 6 +++--- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 0fbdc18..468fd55 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,6 +1,7 @@ linters: disable-all: true enable: + - gofmt - goimports - ineffassign - staticcheck diff --git a/internal/graph/graph.go b/internal/graph/graph.go index 2e90ef0..cadb178 100644 --- a/internal/graph/graph.go +++ b/internal/graph/graph.go @@ -88,7 +88,7 @@ func (g *Graph[V]) HasVertexWithId(id string) bool { // Reverse reverses the edges of the map. The sources become the sinks and vice versa. func (g *Graph[V]) Reverse() { reversedEdges := make(AdjacencyMatrix) - for vertexId, _ := range g.verticesById { + for vertexId := range g.verticesById { reversedEdges[vertexId] = make(map[string]bool) } for source, adjacentEdgesMap := range g.edges { diff --git a/internal/graph/graph_test.go b/internal/graph/graph_test.go index de0a010..c6b765e 100644 --- a/internal/graph/graph_test.go +++ b/internal/graph/graph_test.go @@ -136,7 +136,7 @@ func TestCopy(t *testing.T) { "shared_1", "shared_2", "shared_3", "g_1", "g_2", "g_3", }) - // validate overrides weren't copied over and non-overriden shared nodes are the same + // validate overrides weren't copied over and non-overridden shared nodes are the same assert.NotEqual(t, g.GetVertex("shared_1"), gC.GetVertex("shared_1")) assert.Equal(t, gC.GetVertex("shared_1"), copyOverrideShared1) assert.NotEqual(t, g.GetVertex("shared_2"), gC.GetVertex("shared_2")) @@ -425,7 +425,7 @@ func (v vertex) GetId() string { func getVertexIds(g *Graph[vertex]) []string { var output []string - for id, _ := range g.verticesById { + for id := range g.verticesById { output = append(output, id) } return output diff --git a/internal/migration_acceptance_tests/sequence_cases_test.go b/internal/migration_acceptance_tests/sequence_cases_test.go index 26ce8e4..cb9250d 100644 --- a/internal/migration_acceptance_tests/sequence_cases_test.go +++ b/internal/migration_acceptance_tests/sequence_cases_test.go @@ -200,7 +200,7 @@ var sequenceAcceptanceTests = []acceptanceTestCase{ }, }, { - name: "And and Drop sequences (conflicing schemas)", + name: "And and Drop sequences (conflicting schemas)", oldSchemaDDL: []string{ ` CREATE SCHEMA schema_1; diff --git a/internal/queries/queries.sql b/internal/queries/queries.sql index 8a1ea69..ae69034 100644 --- a/internal/queries/queries.sql +++ b/internal/queries/queries.sql @@ -338,7 +338,7 @@ WHERE AND seq_ns.nspname !~ '^pg_temp' -- Exclude sequences owned by identity columns. -- These manifest as internal dependency on the column - AND (depend.deptype IS NULL OR depend.deptype != 'i') + AND (depend.deptype IS null OR depend.deptype != 'i') -- Exclude sequences belonging to extensions AND NOT EXISTS ( SELECT ext_depend.objid diff --git a/pkg/diff/sql_generator.go b/pkg/diff/sql_generator.go index caf9aec..94f67ab 100644 --- a/pkg/diff/sql_generator.go +++ b/pkg/diff/sql_generator.go @@ -55,7 +55,7 @@ var ( } migrationHazardExtensionDroppedCannotTrackDependencies = MigrationHazard{ Type: MigrationHazardTypeHasUntrackableDependencies, - Message: "This extension may be in use by tables, indexes, functions, triggers, etc. Tihs statement will be ran last, so this may be OK.", + Message: "This extension may be in use by tables, indexes, functions, triggers, etc. This statement will be ran last, so this may be OK.", } migrationHazardExtensionAlteredVersionUpgraded = MigrationHazard{ Type: MigrationHazardTypeExtensionVersionUpgrade, diff --git a/pkg/diff/transform_diff.go b/pkg/diff/transform_diff.go index 98ff5ca..e317adb 100644 --- a/pkg/diff/transform_diff.go +++ b/pkg/diff/transform_diff.go @@ -14,7 +14,7 @@ import ( // original SchemaDiff struct func dataPackNewTables(s schemaDiff) schemaDiff { copiedNewTables := append([]schema.Table(nil), s.tableDiffs.adds...) - for i, _ := range copiedNewTables { + for i := range copiedNewTables { copiedColumns := append([]schema.Column(nil), copiedNewTables[i].Columns...) copiedNewTables[i].Columns = copiedColumns sort.Slice(copiedColumns, func(i, j int) bool { @@ -31,9 +31,9 @@ func dataPackNewTables(s schemaDiff) schemaDiff { // generator to ignore changes to column ordering func removeChangesToColumnOrdering(s schemaDiff) schemaDiff { copiedTableDiffs := append([]tableDiff(nil), s.tableDiffs.alters...) - for i, _ := range copiedTableDiffs { + for i := range copiedTableDiffs { copiedColDiffs := append([]columnDiff(nil), copiedTableDiffs[i].columnsDiff.alters...) - for i, _ := range copiedColDiffs { + for i := range copiedColDiffs { copiedColDiffs[i].oldOrdering = copiedColDiffs[i].newOrdering } copiedTableDiffs[i].columnsDiff.alters = copiedColDiffs From 45d147a0e06f886cd68bb0174b05cd0a4e060815 Mon Sep 17 00:00:00 2001 From: bplunkett-stripe Date: Wed, 11 Dec 2024 12:59:59 -0800 Subject: [PATCH 3/4] Bump sqlfluff version --- build/Dockerfile.lint | 2 +- internal/queries/queries.sql | 48 +++++++++++++++++++-------------- internal/queries/queries.sql.go | 2 +- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/build/Dockerfile.lint b/build/Dockerfile.lint index aada94f..1f410b9 100644 --- a/build/Dockerfile.lint +++ b/build/Dockerfile.lint @@ -11,7 +11,7 @@ RUN wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/master # Install sqlfluff RUN pip install wheel # It complains if we attempt to install this in the same command as Cython RUN pip install "Cython<3.0" pyyaml --no-build-isolation # Fix for https://github.com/yaml/pyyaml/issues/601 -RUN pip install "sqlfluff==2.1.2" +RUN pip install "sqlfluff==3.3.0" WORKDIR /pg-schema-diff COPY . . diff --git a/internal/queries/queries.sql b/internal/queries/queries.sql index ae69034..ca3ca0a 100644 --- a/internal/queries/queries.sql +++ b/internal/queries/queries.sql @@ -17,7 +17,7 @@ WHERE -- name: GetTables :many SELECT - c.oid AS oid, + c.oid, c.relname::TEXT AS table_name, table_namespace.nspname::TEXT AS table_schema_name, c.relreplident::TEXT AS replica_identity, @@ -40,7 +40,7 @@ INNER JOIN ON c.relnamespace = table_namespace.oid LEFT JOIN pg_catalog.pg_inherits AS table_inherits - ON table_inherits.inhrelid = c.oid + ON c.oid = table_inherits.inhrelid LEFT JOIN pg_catalog.pg_class AS parent_c ON table_inherits.inhparent = parent_c.oid @@ -98,16 +98,16 @@ SELECT FROM pg_catalog.pg_attribute AS a LEFT JOIN pg_catalog.pg_attrdef AS d - ON (d.adrelid = a.attrelid AND d.adnum = a.attnum) -LEFT JOIN pg_catalog.pg_collation AS coll ON coll.oid = a.attcollation + ON (a.attrelid = d.adrelid AND a.attnum = d.adnum) +LEFT JOIN pg_catalog.pg_collation AS coll ON a.attcollation = coll.oid LEFT JOIN pg_catalog.pg_namespace AS collation_namespace - ON collation_namespace.oid = coll.collnamespace + ON coll.collnamespace = collation_namespace.oid LEFT JOIN identity_col_seq ON - identity_col_seq.owner_relid = a.attrelid - AND identity_col_seq.owner_attnum = a.attnum + a.attrelid = identity_col_seq.owner_relid + AND a.attnum = identity_col_seq.owner_attnum WHERE a.attrelid = $1 AND a.attnum > 0 @@ -116,7 +116,7 @@ ORDER BY a.attnum; -- name: GetIndexes :many SELECT - c.oid AS oid, + c.oid, c.relname::TEXT AS index_name, table_c.relname::TEXT AS table_name, table_namespace.nspname::TEXT AS table_schema_name, @@ -132,21 +132,25 @@ SELECT COALESCE(parent_c.relname, '')::TEXT AS parent_index_name, COALESCE(parent_namespace.nspname, '')::TEXT AS parent_index_schema_name, ( - SELECT ARRAY_AGG(att.attname ORDER BY indkey_ord.ord) + SELECT + ARRAY_AGG( + att.attname + ORDER BY indkey_ord.ord + ) FROM UNNEST(i.indkey) WITH ORDINALITY AS indkey_ord (attnum, ord) INNER JOIN pg_catalog.pg_attribute AS att - ON att.attrelid = table_c.oid AND att.attnum = indkey_ord.attnum + ON att.attrelid = table_c.oid AND indkey_ord.attnum = att.attnum )::TEXT [] AS column_names, COALESCE(con.conislocal, false) AS constraint_is_local FROM pg_catalog.pg_class AS c -INNER JOIN pg_catalog.pg_index AS i ON (i.indexrelid = c.oid) -INNER JOIN pg_catalog.pg_class AS table_c ON (table_c.oid = i.indrelid) +INNER JOIN pg_catalog.pg_index AS i ON (c.oid = i.indexrelid) +INNER JOIN pg_catalog.pg_class AS table_c ON (i.indrelid = table_c.oid) INNER JOIN pg_catalog.pg_namespace AS table_namespace ON table_c.relnamespace = table_namespace.oid LEFT JOIN pg_catalog.pg_constraint AS con - ON (con.conindid = c.oid AND con.contype IN ('p', 'u', null)) + ON (c.oid = con.conindid AND con.contype IN ('p', 'u', null)) LEFT JOIN pg_catalog.pg_inherits AS idx_inherits ON (c.oid = idx_inherits.inhrelid) @@ -222,7 +226,7 @@ WHERE AND pg_constraint.contype = 'f' AND pg_constraint.conislocal; --- name: GetFunctions :many +-- name: GetProcs :many SELECT pg_proc.oid, pg_proc.proname::TEXT AS func_name, @@ -238,12 +242,12 @@ INNER JOIN ON pg_proc.pronamespace = proc_namespace.oid INNER JOIN pg_catalog.pg_language AS proc_lang - ON proc_lang.oid = pg_proc.prolang + ON pg_proc.prolang = proc_lang.oid WHERE proc_namespace.nspname NOT IN ('pg_catalog', 'information_schema') AND proc_namespace.nspname !~ '^pg_toast' AND proc_namespace.nspname !~ '^pg_temp' - AND pg_proc.prokind = 'f' + AND pg_proc.prokind = $1 -- Exclude functions belonging to extensions AND NOT EXISTS ( SELECT depend.objid @@ -358,7 +362,7 @@ SELECT FROM pg_catalog.pg_namespace AS extension_namespace INNER JOIN pg_catalog.pg_extension AS ext - ON ext.extnamespace = extension_namespace.oid + ON extension_namespace.oid = ext.extnamespace WHERE extension_namespace.nspname NOT IN ('pg_catalog', 'information_schema') AND extension_namespace.nspname !~ '^pg_toast' @@ -370,14 +374,18 @@ SELECT pg_type.typname::TEXT AS enum_name, type_namespace.nspname::TEXT AS enum_schema_name, ( - SELECT ARRAY_AGG(pg_enum.enumlabel ORDER BY pg_enum.enumsortorder) + SELECT + ARRAY_AGG( + pg_enum.enumlabel + ORDER BY pg_enum.enumsortorder + ) FROM pg_catalog.pg_enum WHERE pg_enum.enumtypid = pg_type.oid )::TEXT [] AS enum_labels FROM pg_catalog.pg_type AS pg_type INNER JOIN pg_catalog.pg_namespace AS type_namespace - ON type_namespace.oid = pg_type.typnamespace + ON pg_type.typnamespace = type_namespace.oid WHERE pg_type.typtype = 'e' AND type_namespace.nspname NOT IN ('pg_catalog', 'information_schema') @@ -414,7 +422,7 @@ SELECT table_namespace.nspname::TEXT AS owning_table_schema_name, pol.polpermissive AS is_permissive, ( - SELECT ARRAY_AGG(rolname) + SELECT ARRAY_AGG(roles.rolname) FROM roles WHERE roles.oid = ANY(pol.polroles) )::TEXT [] AS applies_to, diff --git a/internal/queries/queries.sql.go b/internal/queries/queries.sql.go index e63f338..1c36969 100644 --- a/internal/queries/queries.sql.go +++ b/internal/queries/queries.sql.go @@ -801,7 +801,7 @@ WHERE AND seq_ns.nspname !~ '^pg_temp' -- Exclude sequences owned by identity columns. -- These manifest as internal dependency on the column - AND (depend.deptype IS NULL OR depend.deptype != 'i') + AND (depend.deptype IS null OR depend.deptype != 'i') -- Exclude sequences belonging to extensions AND NOT EXISTS ( SELECT ext_depend.objid From 221671504a3d1a34061892d86ecbf5c7371391bc Mon Sep 17 00:00:00 2001 From: bplunkett-stripe Date: Wed, 11 Dec 2024 13:57:20 -0800 Subject: [PATCH 4/4] Treat partitions as not having identity columns --- internal/schema/schema.go | 3 ++- internal/schema/schema_test.go | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/internal/schema/schema.go b/internal/schema/schema.go index 4849cba..e8c50e1 100644 --- a/internal/schema/schema.go +++ b/internal/schema/schema.go @@ -865,7 +865,8 @@ func (s *schemaFetcher) buildTable( } var identity *ColumnIdentity - if len(column.IdentityType) > 0 { + if len(column.IdentityType) > 0 && table.ParentTableName == "" { + // Exclude identity columns from table partitions because they are owned by the parent. identity = &ColumnIdentity{ Type: ColumnIdentityType(column.IdentityType), StartValue: column.StartValue.Int64, diff --git a/internal/schema/schema_test.go b/internal/schema/schema_test.go index 7f7eb0b..ca6abe0 100644 --- a/internal/schema/schema_test.go +++ b/internal/schema/schema_test.go @@ -469,7 +469,7 @@ var ( content TEXT DEFAULT '', genre VARCHAR(256) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP CHECK (created_at > CURRENT_TIMESTAMP - interval '1 month'), - version INT NOT NULL DEFAULT 0, + version INT GENERATED ALWAYS AS IDENTITY, PRIMARY KEY (author, id) ) PARTITION BY LIST (author); ALTER TABLE foo ADD CONSTRAINT author_check CHECK (author IS NOT NULL AND LENGTH(author) > 0) NOT VALID; @@ -524,7 +524,7 @@ var ( ALTER TABLE foo_fk_1 ADD CONSTRAINT foo_fk_1_fk FOREIGN KEY (author, content) REFERENCES foo_1 (author, content) NOT VALID; `}, - expectedHash: "cf473d75363e9f77", + expectedHash: "38588fed86b25fd", expectedSchema: Schema{ NamedSchemas: []NamedSchema{ {Name: "public"}, @@ -538,7 +538,9 @@ var ( {Name: "content", Type: "text", Default: "''::text", IsNullable: true, Size: -1, Collation: defaultCollation}, {Name: "genre", Type: "character varying(256)", Size: -1, Collation: defaultCollation}, {Name: "created_at", Type: "timestamp without time zone", Default: "CURRENT_TIMESTAMP", Size: 8}, - {Name: "version", Type: "integer", Default: "0", Size: 4}, + {Name: "version", Type: "integer", Size: 4, + Identity: &ColumnIdentity{Type: "a", MinValue: 1, MaxValue: 2147483647, StartValue: 1, Increment: 1, CacheSize: 1, Cycle: false}, + }, }, CheckConstraints: []CheckConstraint{ {Name: "author_check", Expression: "((author IS NOT NULL) AND (length(author) > 0))", IsInheritable: true, KeyColumns: []string{"author"}}, @@ -557,7 +559,7 @@ var ( {Name: "content", Type: "text", Default: "''::text", Size: -1, Collation: defaultCollation}, {Name: "genre", Type: "character varying(256)", Size: -1, Collation: defaultCollation}, {Name: "created_at", Type: "timestamp without time zone", Default: "CURRENT_TIMESTAMP", Size: 8}, - {Name: "version", Type: "integer", Default: "0", Size: 4}, + {Name: "version", Type: "integer", IsNullable: false, Size: 4}, }, CheckConstraints: nil, ReplicaIdentity: ReplicaIdentityNothing, @@ -572,7 +574,7 @@ var ( {Name: "content", Type: "text", Default: "''::text", IsNullable: true, Size: -1, Collation: defaultCollation}, {Name: "genre", Type: "character varying(256)", Size: -1, Collation: defaultCollation}, {Name: "created_at", Type: "timestamp without time zone", Default: "CURRENT_TIMESTAMP", Size: 8}, - {Name: "version", Type: "integer", Default: "0", Size: 4}, + {Name: "version", Type: "integer", IsNullable: false, Size: 4}, }, CheckConstraints: nil, ReplicaIdentity: ReplicaIdentityDefault, @@ -587,7 +589,7 @@ var ( {Name: "content", Type: "text", Default: "''::text", IsNullable: true, Size: -1, Collation: defaultCollation}, {Name: "genre", Type: "character varying(256)", Size: -1, Collation: defaultCollation}, {Name: "created_at", Type: "timestamp without time zone", Default: "CURRENT_TIMESTAMP", Size: 8}, - {Name: "version", Type: "integer", Default: "0", Size: 4}, + {Name: "version", Type: "integer", IsNullable: false, Size: 4}, }, CheckConstraints: nil, ReplicaIdentity: ReplicaIdentityDefault,