cockroachdb / cockroachdb/cockroach

sql: type inference fails when using WITH query with parameters

Open
#136,399 2 comments 0 reactions 0 assignees View on GitHub
branch-release-23.2 C-bug O-community T-sql-queries X-blathers-triaged
Dominant language
Go
Stars
32.5k
Forks
4.1k
PR merge metrics
PR metrics pending

Description

**Describe the problem**

When running parameterized statement alongside with CTE query, CockroachDB fails to infer type of the parameter.

Table:
```sql
CREATE TABLE foo (
a INT PRIMARY KEY,
b VARCHAR(10),
c INT
);
```

Following statement fails: ($1 = `int(1)`)
```sql
WITH x AS (SELECT 1, '') UPSERT INTO bar (a, b, c) SELECT *, $1 FROM x;
-- ERROR: value type string doesn't match type int of column "c" (SQLSTATE 42804)
```

However the following statements succeeds:
```sql
WITH x AS (SELECT '', 1) UPSERT INTO bar (b, a, c) SELECT *, $1 FROM x;
WITH x AS (SELECT 1) UPSERT INTO bar (a, b, c) SELECT *, '', $1 FROM x;
WITH x AS (SELECT 1, '', $1) UPSERT INTO bar (a, b, c) SELECT * FROM x;
```

All of the statements runs without error on PostgreSQL 17.

**To Reproduce**

Minimal Go code to reproduce:
```go
package main

import (
"context"

"github.com/jackc/pgx/v5"
)

func main() {
conn, err := pgx.Connect(context.Background(), "postgres://root@localhost:26257/default")
if err != nil {
panic(err)
}
// CREATE TABLE foo (a INT PRIMARY KEY, b VARCHAR(10), c INT)
_, err = conn.Exec(context.Background(), "WITH x AS (SELECT 1, '') UPSERT INTO foo SELECT *, $1 FROM x", 1)
if err != nil {
panic(err)
}
}
```

**Expected behavior**

Statement runs without error.

**Environment:**
- CockroachDB version 23.2.6
- Server OS: Docker for Mac
- Client app: Go 1.23.2, github.com/jackc/pgx/v5 v5.5.5

Jira issue: CRDB-45018

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.