From 75fbc1baaf4fd3eb77e598c945d058f86edb3a5f Mon Sep 17 00:00:00 2001 From: go-jet Date: Wed, 19 Jul 2023 14:24:25 +0200 Subject: [PATCH] Bug225: Incorrect scan for duplicate aliased subtype slice. --- qrm/scan_context.go | 2 +- tests/postgres/alltypes_test.go | 132 +++++++++++++++++++++++++++++++ tests/postgres/generator_test.go | 6 +- tests/testdata | 2 +- 4 files changed, 138 insertions(+), 4 deletions(-) diff --git a/qrm/scan_context.go b/qrm/scan_context.go index 5af480c..7a3c538 100644 --- a/qrm/scan_context.go +++ b/qrm/scan_context.go @@ -132,7 +132,7 @@ func (s *ScanContext) getGroupKey(structType reflect.Type, structField *reflect. mapKey := structType.Name() if structField != nil { - mapKey = concat(mapKey, structField.Type.String()) + mapKey = concat(mapKey, structField.Type.String(), string(structField.Tag)) } if groupKeyInfo, ok := s.groupKeyInfoCache[mapKey]; ok { diff --git a/tests/postgres/alltypes_test.go b/tests/postgres/alltypes_test.go index 8a7cc41..f5839e3 100644 --- a/tests/postgres/alltypes_test.go +++ b/tests/postgres/alltypes_test.go @@ -1410,3 +1410,135 @@ var allTypesRow1 = model.AllTypes{ TextMultiDimArrayPtr: nil, TextMultiDimArray: "{{meeting,lunch},{training,presentation}}", } + +func TestAliasedDuplicateSliceSubType(t *testing.T) { + + children := Components.AS("children") + childrenVulnerabilities := Vulnerabilities.AS("children_vulnerabilities") + + stmt := SELECT( + Components.AllColumns, + Vulnerabilities.AllColumns, + children.AllColumns, + childrenVulnerabilities.AllColumns, + ).FROM( + Components. + LEFT_JOIN(Vulnerabilities, Vulnerabilities.ComponentsID.EQ(Components.ID)). + LEFT_JOIN(children, children.ParentID.EQ(Components.ID)). + LEFT_JOIN(childrenVulnerabilities, childrenVulnerabilities.ComponentsID.EQ(children.ID)), + ).ORDER_BY( + Components.ID, + Vulnerabilities.ID, + children.ID, + childrenVulnerabilities.ID, + ) + + testutils.AssertDebugStatementSql(t, stmt, ` +SELECT components.id AS "components.id", + components.parent_id AS "components.parent_id", + vulnerabilities.id AS "vulnerabilities.id", + vulnerabilities.components_id AS "vulnerabilities.components_id", + children.id AS "children.id", + children.parent_id AS "children.parent_id", + children_vulnerabilities.id AS "children_vulnerabilities.id", + children_vulnerabilities.components_id AS "children_vulnerabilities.components_id" +FROM test_sample.components + LEFT JOIN test_sample.vulnerabilities ON (vulnerabilities.components_id = components.id) + LEFT JOIN test_sample.components AS children ON (children.parent_id = components.id) + LEFT JOIN test_sample.vulnerabilities AS children_vulnerabilities ON (children_vulnerabilities.components_id = children.id) +ORDER BY components.id, vulnerabilities.id, children.id, children_vulnerabilities.id; +`) + + var dest []struct { + model.Components + Vulnerabilities []model.Vulnerabilities + Children []struct { + model.Components `alias:"children"` + Vulnerabilities []model.Vulnerabilities `alias:"children_vulnerabilities"` + } + } + + err := stmt.Query(db, &dest) + require.NoError(t, err) + + testutils.PrintJson(dest) + + testutils.AssertJSON(t, dest, ` +[ + { + "ID": "component_00", + "ParentID": null, + "Vulnerabilities": [ + { + "ID": "vulnerability_00", + "ComponentsID": "component_00" + }, + { + "ID": "vulnerability_01", + "ComponentsID": "component_00" + }, + { + "ID": "vulnerability_02", + "ComponentsID": "component_00" + }, + { + "ID": "vulnerability_03", + "ComponentsID": "component_00" + } + ], + "Children": [ + { + "ID": "component_01", + "ParentID": "component_00", + "Vulnerabilities": [ + { + "ID": "vulnerability_11", + "ComponentsID": "component_01" + }, + { + "ID": "vulnerability_12", + "ComponentsID": "component_01" + } + ] + }, + { + "ID": "component_02", + "ParentID": "component_00", + "Vulnerabilities": [ + { + "ID": "vulnerability_21", + "ComponentsID": "component_02" + } + ] + } + ] + }, + { + "ID": "component_01", + "ParentID": "component_00", + "Vulnerabilities": [ + { + "ID": "vulnerability_11", + "ComponentsID": "component_01" + }, + { + "ID": "vulnerability_12", + "ComponentsID": "component_01" + } + ], + "Children": null + }, + { + "ID": "component_02", + "ParentID": "component_00", + "Vulnerabilities": [ + { + "ID": "vulnerability_21", + "ComponentsID": "component_02" + } + ], + "Children": null + } +] +`) +} diff --git a/tests/postgres/generator_test.go b/tests/postgres/generator_test.go index 0d39598..2d15ee2 100644 --- a/tests/postgres/generator_test.go +++ b/tests/postgres/generator_test.go @@ -547,12 +547,14 @@ func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) { testutils.AssertFileContent(t, enumDir+"/level.go", levelEnumContent) testutils.AssertFileNamesEqual(t, modelDir, "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", "people.go") + "mood.go", "person.go", "person_phone.go", "weird_names_table.go", "level.go", "user.go", "floats.go", "people.go", + "components.go", "vulnerabilities.go") testutils.AssertFileContent(t, modelDir+"/all_types.go", allTypesModelContent) testutils.AssertFileNamesEqual(t, tableDir, "all_types.go", "employee.go", "link.go", - "person.go", "person_phone.go", "weird_names_table.go", "user.go", "floats.go", "people.go", "table_use_schema.go") + "person.go", "person_phone.go", "weird_names_table.go", "user.go", "floats.go", "people.go", "table_use_schema.go", + "components.go", "vulnerabilities.go") testutils.AssertFileContent(t, tableDir+"/all_types.go", allTypesTableContent) } diff --git a/tests/testdata b/tests/testdata index af038e2..c17c7dd 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit af038e2a3de1de825fc396eb1a4c5913876bd25c +Subproject commit c17c7dd9b29882499e8d22078e6c5ea098581aec