Skip to content

Commit ae37ca7

Browse files
committed
parser: Generate correct types for SELECT NOT EXISTS
Signed-off-by: Andrew Haines <andrew@haines.org.nz>
1 parent 8df32e1 commit ae37ca7

File tree

17 files changed

+313
-0
lines changed

17 files changed

+313
-0
lines changed

internal/compiler/output_columns.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,23 @@ func outputColumns(qc *QueryCatalog, node ast.Node) ([]*Column, error) {
117117
cols = append(cols, &Column{Name: name, DataType: "any", NotNull: false})
118118
}
119119

120+
case *ast.BoolExpr:
121+
name := ""
122+
if res.Name != nil {
123+
name = *res.Name
124+
}
125+
notNull := false
126+
if n.Boolop == ast.BoolExprTypeNot && len(n.Args.Items) == 1 {
127+
sublink, ok := n.Args.Items[0].(*ast.SubLink)
128+
if ok && sublink.SubLinkType == ast.EXISTS_SUBLINK {
129+
notNull = true
130+
if name == "" {
131+
name = "not_exists"
132+
}
133+
}
134+
}
135+
cols = append(cols, &Column{Name: name, DataType: "bool", NotNull: notNull})
136+
120137
case *ast.CaseExpr:
121138
name := ""
122139
if res.Name != nil {

internal/endtoend/testdata/select_not_exists/pgx/v4/go/db.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/select_not_exists/pgx/v4/go/models.go

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/select_not_exists/pgx/v4/go/query.sql.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CREATE TABLE bar (id serial not null);
2+
3+
-- name: BarNotExists :one
4+
SELECT
5+
NOT EXISTS (
6+
SELECT
7+
1
8+
FROM
9+
bar
10+
where
11+
id = $1
12+
);
Lines changed: 13 additions & 0 deletions
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+
}

internal/endtoend/testdata/select_not_exists/pgx/v5/go/db.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/select_not_exists/pgx/v5/go/models.go

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/select_not_exists/pgx/v5/go/query.sql.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CREATE TABLE bar (id serial not null);
2+
3+
-- name: BarNotExists :one
4+
SELECT
5+
NOT EXISTS (
6+
SELECT
7+
1
8+
FROM
9+
bar
10+
where
11+
id = $1
12+
);
Lines changed: 13 additions & 0 deletions
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+
}

internal/endtoend/testdata/select_not_exists/stdlib/go/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/select_not_exists/stdlib/go/models.go

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/select_not_exists/stdlib/go/query.sql.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CREATE TABLE bar (id serial not null);
2+
3+
-- name: BarNotExists :one
4+
SELECT
5+
NOT EXISTS (
6+
SELECT
7+
1
8+
FROM
9+
bar
10+
where
11+
id = $1
12+
);
Lines changed: 11 additions & 0 deletions
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+
}

internal/sql/ast/bool_expr_type.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
package ast
22

3+
// https://github.com/pganalyze/libpg_query/blob/13-latest/protobuf/pg_query.proto#L2783-L2789
4+
const (
5+
_ BoolExprType = iota
6+
BoolExprTypeAnd
7+
BoolExprTypeOr
8+
BoolExprTypeNot
9+
)
10+
311
type BoolExprType uint
412

513
func (n *BoolExprType) Pos() int {

0 commit comments

Comments
 (0)