-- #7094 matriz master vs v2: cada sentencia imprime OK o ERROR + SQLSTATE. -- XX000 = elog interno (no deberia ser alcanzable desde SQL); -- 42846 = cannot_coerce (error de usuario). \set ON_ERROR_STOP off \set SHOW_CONTEXT never \pset footer off \echo '=== A. el bug reportado' \echo '--- A1 select cast(NULL::text as unknown)' select cast(NULL::text as unknown); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- A2 cast de una columna text a unknown' create table t(a text); insert into t values ('x'); select cast(a as unknown) from t; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '=== B. contextos donde el unknown NO se resuelve a text (master podria funcionar hoy)' \echo '--- B1 ... is null' select cast('a'::text as unknown) is null; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- B2 pg_typeof(...)' select pg_typeof(cast('a'::text as unknown)); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- B3 length(...)' select length(cast('a'::text as unknown)); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- B4 where ... = literal' select 1 as uno where cast('a'::text as unknown) = 'a'; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- B5 values(...)' select count(*) from (values (cast('a'::text as unknown))) v(x); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- B6 (...)::text' select cast('a'::text as unknown)::text; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '=== C. PL/pgSQL (jian: HEAD acepta la asignacion via I/O)' \echo '--- C1 int := text::unknown' do $$ declare a int; begin a := '1'::text::unknown; raise notice 'a=%', a; end $$; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- C2 text := text::unknown (el caso del test del patch)' do $$ declare a text; begin a := 's'::text::unknown; raise notice 'a=%', a; end $$; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- C3 text := literal::unknown (control)' do $$ declare a text; begin a := 'x'::unknown; raise notice 'a=%', a; end $$; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '=== D. controles que NO deberian cambiar' \echo '--- D1 literal::unknown' select 'a'::unknown; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- D2 cast(literal as unknown)' select cast('a' as unknown); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- D3 cast(1 as unknown)' select cast(1 as unknown); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- D4 literal::unknown::text' select 'a'::unknown::text; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- D5 literal::unknown + 1' select '1'::unknown + 1; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '=== E. cast con sintaxis de funcion (parse_func.c llama a find_coercion_pathway)' \echo '--- E1 unknown(literal)' select unknown('a'); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- E2 unknown(text)' select unknown('a'::text); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- E3 unknown(unknownin(...)) -- unknown -> unknown sin ser Const' select unknown(unknownin('a')); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- E4 pg_typeof(unknownin(...)) (control: unknownin devuelve unknown)' select pg_typeof(unknownin('a')); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '=== F. arrays' \echo '--- F1 existe _unknown?' select typname, typarray from pg_type where typname in ('unknown', '_unknown') order by 1; \echo '--- F2 text[]::unknown[]' select '{a}'::text[]::unknown[]; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '=== G. objetos que se guardan' \echo '--- G1 create view ... cast(text as unknown)' create view v1 as select cast('a'::text as unknown) as c; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- G2 create table as ... cast(text as unknown)' create table ctas as select cast('a'::text as unknown) as c; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '=== U. la OTRA puerta: unknownin() tambien produce un unknown que no es literal' \echo '--- U1 select unknownin(a)' select unknownin('a'); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- U2 select length(unknownin(a))' select length(unknownin('a')); \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '--- U3 select unknownin(a)::text' select unknownin('a')::text; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif \echo '=== H. prepared' \echo '--- H1 prepare p(text) as select $1::unknown' prepare p1(text) as select $1::unknown; \if :ERROR \echo ' => ERROR' :LAST_ERROR_SQLSTATE \else \echo ' => OK' \endif