Extending varchar domain leaves old smaller size in PSQL BLR
------------------------------------------------------------

                 Key: CORE-5812
                 URL: http://tracker.firebirdsql.org/browse/CORE-5812
             Project: Firebird Core
          Issue Type: Bug
    Affects Versions: 2.5.8
         Environment: First detected on this env:
WI-V2.5.7.27050 Firebird 2.5 classic
windows 10
            Reporter: Pavel Cisar


Consistently reproducible test case:

create domain dmn varchar(1);
commit;
create table tbl(fld dmn);
commit;

set term ^;
create procedure sp
returns (fld dmn)
as begin
  for select case when 1=1 then fld else 'x' end from tbl into :fld
  do begin
    suspend;
  end
end
^
set term ;^
commit;

alter domain dmn type varchar(2);
commit;

insert into tbl (fld) values ('12');
commit;

set term ^;
alter procedure sp
returns (fld dmn)
as begin
  select fld from tbl into :fld; /* select field uses new domain type 
varchar(2) */
  suspend;
end
^
set term ;^
commit;

select * from sp; /*no exception*/
commit;

set term ^;
alter procedure sp
returns (fld dmn)
as begin
  select case when 1=1 then fld else 'x' end from tbl into :fld;  /* case when 
fld still uses old domain type varchar(1) in BLR */
  suspend;
end
^
set term ;^
commit;

select * from sp; /*string truncation*/
commit;

/*reconnect*/

select * from sp; /*still string truncation*/
commit;

set term ^;
alter procedure sp
returns (fld dmn)
as begin
  select case when 1=1 then fld else 'x' end from tbl into :fld;  /* after 
reconnect 'case when fld' starts to use new domain type varchar(2) in BLR */
  suspend;
end
^
set term ;^
commit;

select * from sp; /*no more exception*/
commit;

drop procedure sp;
drop table tbl;
drop domain dmn;
commit;

--- Initial comment from Vlad Khorsun:

The issue is related with metadata caching (it was obvious). There is no cache 
of domains, but there is cache of relations and cached relations
(of course) have fields with data types. When domain definition changed, 
relations in cache are not invalidated. Thus, SQL parser uses old data
type (not domain based, just raw data type) when handle procedure text. In 
particular, it CAST result of CASE expression to the VARCHAR(1) data
type. You may see in generated BLR something like

...
blr_cast, blr_varying2, 0,0, 1,0,
  blr_value_if,
...

Later, when engine executed query, it knows real data type for the relation
field (VARCHAR(2)) but should CAST it to the VARCHAR(1) - here it raised
"string right truncation" error.

So far i see no quick way to fix it, sorry


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to