cockroachdb / cockroachdb/cockroach

sql: typing too strict in PL/pgSQL function

Open
#146,542 1 comment 0 reactions 0 assignees View on GitHub
A-sql-pgcompat A-sql-plpgsql A-sql-typing branch-release-25.2 C-bug O-qa T-sql-queries
Dominant language
Go
Stars
32.5k
Forks
4.1k
PR merge metrics
PR metrics pending

Description

**Describe the problem**

When creating a PL/pgSQL function, it won't allow me to implicitly cast `VARCHAR(255)` to `VARCHAR`.

**To Reproduce**

On 25.2-beta.3, I ran the following:

```sql
CREATE TABLE public.film (
film_id INT4 NOT NULL DEFAULT nextval('public.film_film_id_seq'::REGCLASS),
title VARCHAR(255) NOT NULL,
description STRING NULL,
release_year INT4 NULL,
language_id INT2 NOT NULL,
rental_duration INT2 NOT NULL DEFAULT 3:::INT8,
rental_rate DECIMAL(4,2) NOT NULL DEFAULT 4.99:::DECIMAL,
length INT2 NULL,
replacement_cost DECIMAL(5,2) NOT NULL DEFAULT 19.99:::DECIMAL,
rating public.mpaa_rating NULL DEFAULT 'G':::public.mpaa_rating,
last_update TIMESTAMP NOT NULL DEFAULT now():::TIMESTAMP,
special_features STRING[] NULL,
fulltext TSVECTOR NOT NULL,
CONSTRAINT film_pkey PRIMARY KEY (film_id ASC),
CONSTRAINT film_language_id_fkey FOREIGN KEY (language_id) REFERENCES public.language(language_id) ON DELETE RESTRICT ON UPDATE CASCADE,
INVERTED INDEX film_fulltext_idx (fulltext),
INDEX idx_fk_language_id (language_id ASC),
INDEX idx_title (title ASC),
CONSTRAINT check_release_year_release_year CHECK ((release_year >= 1901:::INT8) AND (release_year <= 2155:::INT8))
);

create or replace function get_film (
p_pattern varchar
)
returns table (
film_title varchar,
film_release_year int
)
language plpgsql
as $$
begin
return query
select
title,
release_year::integer
from
film
where
title ilike p_pattern;
end;
$$;
```

This returned the error:
```
ERROR: structure of query does not match function result type
SQLSTATE: 42804
DETAIL: Returned type VARCHAR(255) does not match expected type VARCHAR in column 1.
```
On postgres, this does not cause any error. I can successfully create the function, and call it successfully as follows:
```
SELECT * FROM get_film ('Al%');
```

**Expected behavior**
We should try to match Postgres' behavior.

Jira issue: CRDB-50592

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.