From a4191b49530565f48751ee2d8fe0064a552dd5dc Mon Sep 17 00:00:00 2001 From: Cedric L'homme Date: Mon, 30 Jan 2023 10:42:06 -0500 Subject: [PATCH 1/5] fix generated columns in mutable columns for PostgreSQL Fix https://github.com/go-jet/jet/issues/209. --- generator/metadata/column_meta_data.go | 1 + generator/metadata/table_meta_data.go | 2 +- generator/postgres/query_set.go | 1 + tests/Makefile | 1 + tests/init/init.go | 1 + tests/postgres/generated_test.go | 15 +++++++++++++++ 6 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 tests/postgres/generated_test.go diff --git a/generator/metadata/column_meta_data.go b/generator/metadata/column_meta_data.go index 74184b6..5cd0274 100644 --- a/generator/metadata/column_meta_data.go +++ b/generator/metadata/column_meta_data.go @@ -5,6 +5,7 @@ type Column struct { Name string IsPrimaryKey bool IsNullable bool + IsGenerated bool DataType DataType } diff --git a/generator/metadata/table_meta_data.go b/generator/metadata/table_meta_data.go index 6479dc2..2e01c61 100644 --- a/generator/metadata/table_meta_data.go +++ b/generator/metadata/table_meta_data.go @@ -11,7 +11,7 @@ func (t Table) MutableColumns() []Column { var ret []Column for _, column := range t.Columns { - if column.IsPrimaryKey { + if column.IsPrimaryKey || column.IsGenerated { continue } diff --git a/generator/postgres/query_set.go b/generator/postgres/query_set.go index 16c1275..834b2c5 100644 --- a/generator/postgres/query_set.go +++ b/generator/postgres/query_set.go @@ -44,6 +44,7 @@ WITH primaryKeys AS ( ) SELECT column_name as "column.Name", is_nullable = 'YES' as "column.isNullable", + is_generated = 'ALWAYS' as "column.isGenerated", (EXISTS(SELECT 1 from primaryKeys as pk where pk.column_name = columns.column_name)) as "column.IsPrimaryKey", dataType.kind as "dataType.Kind", (case dataType.Kind when 'base' then data_type else LTRIM(udt_name, '_') end) as "dataType.Name", diff --git a/tests/Makefile b/tests/Makefile index 1a84778..eaccf75 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -47,6 +47,7 @@ jet-gen-postgres: jet -dsn=postgres://jet:jet@localhost:50901/jetdb?sslmode=disable -schema=chinook2 -path=./.gentestdata/ jet -dsn=postgres://jet:jet@localhost:50901/jetdb?sslmode=disable -schema=northwind -path=./.gentestdata/ jet -dsn=postgres://jet:jet@localhost:50901/jetdb?sslmode=disable -schema=test_sample -path=./.gentestdata/ + jet -dsn=postgres://jet:jet@localhost:50901/jetdb?sslmode=disable -schema=test_generated -path=./.gentestdata/ jet-gen-mysql: jet -source=mysql -dsn="jet:jet@tcp(localhost:50902)/dvds" -path=./.gentestdata/mysql diff --git a/tests/init/init.go b/tests/init/init.go index 633457e..f4041a0 100644 --- a/tests/init/init.go +++ b/tests/init/init.go @@ -134,6 +134,7 @@ func initPostgresDB(dbType string, connectionString string) { "test_sample", "chinook", "chinook2", + "test_generated", } for _, schemaName := range schemaNames { diff --git a/tests/postgres/generated_test.go b/tests/postgres/generated_test.go new file mode 100644 index 0000000..f05b672 --- /dev/null +++ b/tests/postgres/generated_test.go @@ -0,0 +1,15 @@ +package postgres + +import ( + . "github.com/go-jet/jet/v2/tests/.gentestdata/jetdb/test_generated/table" + "github.com/stretchr/testify/require" + "testing" +) + +func TestMutableColumnsExcludeGeneratedColumn(t *testing.T) { + t.Run("should not have the generated column in mutableColumns", func(t *testing.T) { + require.Equal(t, 2, len(People.MutableColumns)) + require.Equal(t, People.PeopleName, People.MutableColumns[0]) + require.Equal(t, People.PeopleHeightCm, People.MutableColumns[1]) + }) +} From a1088ead17c8a5541f2bb5beb2084424099a67e1 Mon Sep 17 00:00:00 2001 From: Cedric L'homme Date: Mon, 30 Jan 2023 14:53:16 -0500 Subject: [PATCH 2/5] Move back to test_sample --- tests/Makefile | 1 - tests/init/init.go | 1 - tests/postgres/generated_test.go | 15 ------- tests/postgres/generator_test.go | 4 +- tests/postgres/sample_test.go | 75 ++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 19 deletions(-) delete mode 100644 tests/postgres/generated_test.go diff --git a/tests/Makefile b/tests/Makefile index eaccf75..1a84778 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -47,7 +47,6 @@ jet-gen-postgres: jet -dsn=postgres://jet:jet@localhost:50901/jetdb?sslmode=disable -schema=chinook2 -path=./.gentestdata/ jet -dsn=postgres://jet:jet@localhost:50901/jetdb?sslmode=disable -schema=northwind -path=./.gentestdata/ jet -dsn=postgres://jet:jet@localhost:50901/jetdb?sslmode=disable -schema=test_sample -path=./.gentestdata/ - jet -dsn=postgres://jet:jet@localhost:50901/jetdb?sslmode=disable -schema=test_generated -path=./.gentestdata/ jet-gen-mysql: jet -source=mysql -dsn="jet:jet@tcp(localhost:50902)/dvds" -path=./.gentestdata/mysql diff --git a/tests/init/init.go b/tests/init/init.go index f4041a0..633457e 100644 --- a/tests/init/init.go +++ b/tests/init/init.go @@ -134,7 +134,6 @@ func initPostgresDB(dbType string, connectionString string) { "test_sample", "chinook", "chinook2", - "test_generated", } for _, schemaName := range schemaNames { diff --git a/tests/postgres/generated_test.go b/tests/postgres/generated_test.go deleted file mode 100644 index f05b672..0000000 --- a/tests/postgres/generated_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package postgres - -import ( - . "github.com/go-jet/jet/v2/tests/.gentestdata/jetdb/test_generated/table" - "github.com/stretchr/testify/require" - "testing" -) - -func TestMutableColumnsExcludeGeneratedColumn(t *testing.T) { - t.Run("should not have the generated column in mutableColumns", func(t *testing.T) { - require.Equal(t, 2, len(People.MutableColumns)) - require.Equal(t, People.PeopleName, People.MutableColumns[0]) - require.Equal(t, People.PeopleHeightCm, People.MutableColumns[1]) - }) -} diff --git a/tests/postgres/generator_test.go b/tests/postgres/generator_test.go index fb757ae..f0600d2 100644 --- a/tests/postgres/generator_test.go +++ b/tests/postgres/generator_test.go @@ -573,7 +573,7 @@ func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) { require.NoError(t, err) testutils.AssertFileNamesEqual(t, modelFiles, "all_types.go", "all_types_view.go", "employee.go", "link.go", - "mood.go", "person.go", "person_phone.go", "weird_names_table.go", "level.go", "user.go", "floats.go") + "mood.go", "person.go", "person_phone.go", "weird_names_table.go", "level.go", "user.go", "floats.go", "people.go") testutils.AssertFileContent(t, modelDir+"/all_types.go", allTypesModelContent) @@ -581,7 +581,7 @@ func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) { require.NoError(t, err) testutils.AssertFileNamesEqual(t, tableFiles, "all_types.go", "employee.go", "link.go", - "person.go", "person_phone.go", "weird_names_table.go", "user.go", "floats.go", "table.go") + "person.go", "person_phone.go", "weird_names_table.go", "user.go", "floats.go", "table.go", "people.go") testutils.AssertFileContent(t, tableDir+"/all_types.go", allTypesTableContent) } diff --git a/tests/postgres/sample_test.go b/tests/postgres/sample_test.go index a13a30b..bd3c04b 100644 --- a/tests/postgres/sample_test.go +++ b/tests/postgres/sample_test.go @@ -476,3 +476,78 @@ FROM test_sample."User"; ] `) } + +func TestMutableColumnsExcludeGeneratedColumn(t *testing.T) { + // clean up + _, err := People.DELETE().WHERE(People.PeopleID.GT(Int(3))).Exec(db) + require.NoError(t, err) + + t.Run("should not have the generated column in mutableColumns", func(t *testing.T) { + require.Equal(t, 2, len(People.MutableColumns)) + require.Equal(t, People.PeopleName, People.MutableColumns[0]) + require.Equal(t, People.PeopleHeightCm, People.MutableColumns[1]) + }) + + t.Run("should query with all columns", func(t *testing.T) { + query := SELECT( + People.AllColumns, + ).FROM( + People, + ).WHERE( + People.PeopleID.EQ(Int(3)), + ) + + var result model.People + + err := query.Query(db, &result) + require.NoError(t, err) + + require.Equal(t, "Carla", result.PeopleName) + require.Equal(t, 155., *result.PeopleHeightCm) + require.InEpsilon(t, 61.02, *result.PeopleHeightIn, 1e-3) + }) + + t.Run("should insert without generated columns", func(t *testing.T) { + insertQuery := People.INSERT( + People.MutableColumns, + ).MODEL( + model.People{ + PeopleName: "Dario", + PeopleHeightCm: testutils.Float64Ptr(120), + }, + ).RETURNING( + People.MutableColumns, + ) + + testutils.AssertDebugStatementSql(t, insertQuery, ` +INSERT INTO test_sample.people (people_name, people_height_cm) +VALUES ('Dario', 120) +RETURNING people.people_name AS "people.people_name", + people.people_height_cm AS "people.people_height_cm"; +`) + + var result model.People + err := insertQuery.Query(db, &result) + require.NoError(t, err) + + require.Equal(t, "Dario", result.PeopleName) + require.Equal(t, 120., *result.PeopleHeightCm) + + query := SELECT( + People.AllColumns, + ).FROM( + People, + ).ORDER_BY( + People.PeopleID.DESC(), + ).LIMIT(1) + + result = model.People{} + + err = query.Query(db, &result) + require.NoError(t, err) + + require.Equal(t, "Dario", result.PeopleName) + require.Equal(t, 120., *result.PeopleHeightCm) + require.InEpsilon(t, 47.24, *result.PeopleHeightIn, 1e-3) + }) +} From 5d84197a876e5bac81cb62fbd3e6c4f167f40d2b Mon Sep 17 00:00:00 2001 From: Cedric L'homme Date: Tue, 31 Jan 2023 13:07:36 -0500 Subject: [PATCH 3/5] Update submodule jet-test-data --- tests/testdata | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testdata b/tests/testdata index fdb0cc5..95978a4 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit fdb0cc598d2b534310d2b559ce9a2f75b5507c56 +Subproject commit 95978a458998147f872b23b11b9a9b6a25c32790 From 33e86cd04b087a6026e392f4213061e903839b53 Mon Sep 17 00:00:00 2001 From: Cedric L'homme Date: Wed, 1 Feb 2023 12:33:25 -0500 Subject: [PATCH 4/5] Fix constant in CockroachDB --- generator/postgres/query_set.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/postgres/query_set.go b/generator/postgres/query_set.go index 834b2c5..ea1ac44 100644 --- a/generator/postgres/query_set.go +++ b/generator/postgres/query_set.go @@ -44,7 +44,7 @@ WITH primaryKeys AS ( ) SELECT column_name as "column.Name", is_nullable = 'YES' as "column.isNullable", - is_generated = 'ALWAYS' as "column.isGenerated", + is_generated = 'ALWAYS' or is_generated = 'YES' as "column.isGenerated", (EXISTS(SELECT 1 from primaryKeys as pk where pk.column_name = columns.column_name)) as "column.IsPrimaryKey", dataType.kind as "dataType.Kind", (case dataType.Kind when 'base' then data_type else LTRIM(udt_name, '_') end) as "dataType.Name", From 2f1023342055185f6390ac5361087497eb9c1bdf Mon Sep 17 00:00:00 2001 From: Cedric L'homme Date: Wed, 1 Feb 2023 12:33:51 -0500 Subject: [PATCH 5/5] Update testdata --- tests/testdata | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testdata b/tests/testdata index 95978a4..c85dd20 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit 95978a458998147f872b23b11b9a9b6a25c32790 +Subproject commit c85dd20a33d48df3527acaaf8fdbcb6b3d3a4b57