Bug225: Incorrect scan for duplicate aliased subtype slice.
This commit is contained in:
parent
0a7e0b5392
commit
75fbc1baaf
4 changed files with 138 additions and 4 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
`)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue