Skip to content

Commit 6ce58c1

Browse files
fix(mysql): correct TypeCast inference and add end-to-end tests
1 parent d2b9c0b commit 6ce58c1

7 files changed

Lines changed: 201 additions & 3 deletions

File tree

internal/compiler/infer_expr_type.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,16 @@ func (c *Compiler) inferMySQLTypeCast(node *ast.TypeCast, tables []*Table) Type
127127
return unknownType()
128128
}
129129

130-
base := toColumn(node.TypeName)
131-
if base == nil {
130+
// MySQL populates TypeName.Name directly; toColumn reads TypeName.Names (Postgres-style).
131+
kind := mapMySQLKind(node.TypeName.Name)
132+
if kind == KindUnknown {
132133
return unknownType()
133134
}
134135

135136
arg := c.inferMySQLExpr(node.Arg, tables)
136137

137138
t := Type{
138-
Kind: mapMySQLKind(base.DataType),
139+
Kind: kind,
139140
Valid: true,
140141
}
141142

internal/endtoend/testdata/mysql_expression_type_inference/mysql/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/mysql_expression_type_inference/mysql/go/models.go

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

internal/endtoend/testdata/mysql_expression_type_inference/mysql/go/query.sql.go

Lines changed: 119 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-- name: FloatDivByConst :many
2+
SELECT (value / 1024) AS scaled_value FROM metrics;
3+
4+
-- name: IntDivByConst :many
5+
SELECT (count / 10) AS avg_count FROM metrics;
6+
7+
-- name: FloatDivByFloat :many
8+
SELECT (value / ratio) AS proportion FROM metrics;
9+
10+
-- name: NotNullFloatDivByConst :many
11+
SELECT (CAST(value AS FLOAT) / 1024) AS scaled FROM metrics;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CREATE TABLE metrics (
2+
id INT NOT NULL PRIMARY KEY,
3+
value FLOAT NULL,
4+
count INT NOT NULL,
5+
ratio DOUBLE NULL
6+
);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"sql_package": "database/sql",
7+
"sql_driver": "github.com/go-sql-driver/mysql",
8+
"engine": "mysql",
9+
"name": "querytest",
10+
"schema": "schema.sql",
11+
"queries": "query.sql"
12+
}
13+
]
14+
}

0 commit comments

Comments
 (0)