Added support for array selects

This commit is contained in:
Pijus Kamandulis
2024-02-13 21:57:33 +02:00
parent e89f2e5611
commit 5d2b21dc46
7 changed files with 513 additions and 295 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -49,6 +49,19 @@ func makeColumnList(column interface{}, other_columns interface{}) ([]parsers.Se
return columnList, nil
}
func makeSelectArray(columns interface{}, asClause interface{}) (parsers.SelectItem, error) {
selectItem := parsers.SelectItem{
SelectItems: columns.([]parsers.SelectItem),
Type: parsers.SelectItemTypeArray,
}
if aliasValue, ok := asClause.(string); ok {
selectItem.Alias = aliasValue
}
return selectItem, nil
}
func joinStrings(array []interface{}) string {
var stringsArray []string
for _, elem := range array {
@@ -101,11 +114,17 @@ TableName <- key:Identifier {
return parsers.Table{Value: key.(string)}, nil
}
SelectItem <- name:Identifier path:(DotFieldAccess / ArrayFieldAccess)*
asClause:(ws "AS" ws alias:Identifier { return alias, nil })? {
SelectArray <- "[" ws columns:ColumnList ws "]" asClause:AsClause? {
return makeSelectArray(columns, asClause)
}
SelectItem <- SelectArray / name:Identifier path:(DotFieldAccess / ArrayFieldAccess)*
asClause:AsClause? {
return makeSelectItem(name, path, asClause, parsers.SelectItemTypeField)
}
AsClause <- ws As ws alias:Identifier { return alias, nil }
DotFieldAccess <- "." id:Identifier {
return id, nil
}
@@ -136,6 +155,8 @@ ComparisonExpression <- left:(Literal / SelectItem) ws op:ComparisonOperator ws
Select <- ("select" / "SELECT")
As <- ("as" / "AS")
From <- ("from" / "FROM")
Where <- ("where" / "WHERE")

View File

@@ -65,6 +65,26 @@ func Test_Parse(t *testing.T) {
)
})
t.Run("Should parse SELECT array", func(t *testing.T) {
testQueryParse(
t,
`SELECT [c.id, c.pk] as arr FROM c`,
parsers.SelectStmt{
SelectItems: []parsers.SelectItem{
{
Alias: "arr",
Type: parsers.SelectItemTypeArray,
SelectItems: []parsers.SelectItem{
{Path: []string{"c", "id"}},
{Path: []string{"c", "pk"}},
},
},
},
Table: parsers.Table{Value: "c"},
},
)
})
t.Run("Should parse SELECT with single WHERE condition", func(t *testing.T) {
testQueryParse(
t,