Bug225: Incorrect scan for duplicate aliased subtype slice.

This commit is contained in:
go-jet 2023-07-19 14:24:25 +02:00
parent 0a7e0b5392
commit 75fbc1baaf
4 changed files with 138 additions and 4 deletions

View file

@ -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 {

View file

@ -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
}
]
`)
}

View file

@ -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)
}

@ -1 +1 @@
Subproject commit af038e2a3de1de825fc396eb1a4c5913876bd25c
Subproject commit c17c7dd9b29882499e8d22078e6c5ea098581aec