Skip to content

Commit 5555393

Browse files
authored
fix: CASE-ELSE clause is not properly parsed when a value is constant (#2238)
* fix: CASE-ELSE clause is not properly parsed when a value is constant * fix: error message when failed to parse a type name
1 parent d8f1f73 commit 5555393

File tree

17 files changed

+319
-6
lines changed

17 files changed

+319
-6
lines changed

Diff for: internal/compiler/compat.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func ParseTableName(node ast.Node) (*ast.TableName, error) {
9696
func ParseTypeName(node ast.Node) (*ast.TypeName, error) {
9797
rel, err := parseRelation(node)
9898
if err != nil {
99-
return nil, fmt.Errorf("parse table name: %w", err)
99+
return nil, fmt.Errorf("parse type name: %w", err)
100100
}
101101
return &ast.TypeName{
102102
Catalog: rel.Catalog,

Diff for: internal/compiler/output_columns.go

+12-5
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func outputColumns(qc *QueryCatalog, node ast.Node) ([]*Column, error) {
157157
if res.Name != nil {
158158
name = *res.Name
159159
}
160-
// TODO: The TypeCase code has been copied from below. Instead, we
160+
// TODO: The TypeCase and A_Const code has been copied from below. Instead, we
161161
// need a recurse function to get the type of a node.
162162
if tc, ok := n.Defresult.(*ast.TypeCast); ok {
163163
if tc.TypeName == nil {
@@ -175,11 +175,18 @@ func outputColumns(qc *QueryCatalog, node ast.Node) ([]*Column, error) {
175175
col.Name = name
176176
cols = append(cols, col)
177177
} else if aconst, ok := n.Defresult.(*ast.A_Const); ok {
178-
tn, err := ParseTypeName(aconst.Val)
179-
if err != nil {
180-
return nil, err
178+
switch aconst.Val.(type) {
179+
case *ast.String:
180+
cols = append(cols, &Column{Name: name, DataType: "text", NotNull: true})
181+
case *ast.Integer:
182+
cols = append(cols, &Column{Name: name, DataType: "int", NotNull: true})
183+
case *ast.Float:
184+
cols = append(cols, &Column{Name: name, DataType: "float", NotNull: true})
185+
case *ast.Boolean:
186+
cols = append(cols, &Column{Name: name, DataType: "bool", NotNull: true})
187+
default:
188+
cols = append(cols, &Column{Name: name, DataType: "any", NotNull: false})
181189
}
182-
cols = append(cols, &Column{Name: name, DataType: dataType(tn), NotNull: true})
183190
} else {
184191
cols = append(cols, &Column{Name: name, DataType: "any", NotNull: false})
185192
}

Diff for: internal/endtoend/testdata/case_text/pgx/v4/go/db.go

+32
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: internal/endtoend/testdata/case_text/pgx/v4/go/models.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: internal/endtoend/testdata/case_text/pgx/v4/go/query.sql.go

+38
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CREATE TABLE foo (id text not null);
2+
3+
-- name: CaseStatementText :many
4+
SELECT CASE
5+
WHEN id = $1 THEN 'foo'
6+
ELSE 'bar'
7+
END is_one
8+
FROM foo;
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "postgresql",
7+
"sql_package": "pgx/v4",
8+
"name": "querytest",
9+
"schema": "query.sql",
10+
"queries": "query.sql"
11+
}
12+
]
13+
}

Diff for: internal/endtoend/testdata/case_text/pgx/v5/go/db.go

+32
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: internal/endtoend/testdata/case_text/pgx/v5/go/models.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: internal/endtoend/testdata/case_text/pgx/v5/go/query.sql.go

+38
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CREATE TABLE foo (id text not null);
2+
3+
-- name: CaseStatementText :many
4+
SELECT CASE
5+
WHEN id = $1 THEN 'foo'
6+
ELSE 'bar'
7+
END is_one
8+
FROM foo;
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "postgresql",
7+
"sql_package": "pgx/v5",
8+
"name": "querytest",
9+
"schema": "query.sql",
10+
"queries": "query.sql"
11+
}
12+
]
13+
}

Diff for: internal/endtoend/testdata/case_text/stdlib/go/db.go

+31
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: internal/endtoend/testdata/case_text/stdlib/go/models.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: internal/endtoend/testdata/case_text/stdlib/go/query.sql.go

+41
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CREATE TABLE foo (id text not null);
2+
3+
-- name: CaseStatementText :many
4+
SELECT CASE
5+
WHEN id = $1 THEN 'foo'
6+
ELSE 'bar'
7+
END is_one
8+
FROM foo;
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"name": "querytest",
7+
"schema": "query.sql",
8+
"queries": "query.sql"
9+
}
10+
]
11+
}

0 commit comments

Comments
 (0)