[ 
http://tracker.firebirdsql.org/browse/CORE-3545?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Pavel Zotov reopened CORE-3545:
-------------------------------


Following script and its output shows that when domain based on collation which 
was created with attrubite 'NUMERIC-SORT=1' than some values can be pass 
through limitation od domain definition:
===
    set echo on;
    set term ^;
    execute block as
    begin
      begin execute statement 'drop table test'; when any do begin end end
      begin execute statement 'drop domain dm_nums'; when any do begin end end
      begin execute statement 'drop collation co_nums'; when any do begin end 
end
    end
    ^ set term ;^
    commit;

    show version;
    set list on;
    
    create collation co_nums for utf8 from unicode 'NUMERIC-SORT=1';
    commit;

    create domain dm_nums varchar(3) character set utf8 check (value < '50') 
collate co_nums;
    commit;

    create table test(id int, n dm_nums);
    commit;

    show collation;
    show domain;
    show table test;

    insert into test values(1,   4);
    insert into test values(2, 399);
    insert into test values(2,  50);

    insert into test values(3,  '4');
    insert into test values(3,'399');
    insert into test values(4, '50');


    select * from test;
    commit;


    set term ^;
    execute block returns(o1 dm_nums, o2 dm_nums, o3 dm_nums) as
    begin
      o1 = '4';
      o2 = '399';
      o3 = '50';
      suspend;
    end
    ^

    execute block returns(o1 dm_nums, o2 dm_nums, o3 dm_nums) as
    begin
      o1 = 4;
      o2 = 399;
      o3 = 50;
      suspend;
    end
    ^
    set term ;^
===

STDOUT + STDERR in WI-T3.0.0.31844, starting from line 'show collation':
===
    show collation;
CO_NUMS, CHARACTER SET UTF8, FROM EXTERNAL ('UNICODE'), PAD SPACE, 
'COLL-VERSION=58.0.6.50;NUMERIC-SORT=1'

    show domain;
       DM_NUMS                         
    show table test;
ID                              INTEGER Nullable 
N                               (DM_NUMS) VARCHAR(3) CHARACTER SET UTF8 
Nullable 
                                check (value < '50')
                                 COLLATE CO_NUMS

    insert into test values(1,   4);
    insert into test values(2, 399);
    insert into test values(2,  50);
Statement failed, SQLSTATE = 23000
validation error for column "TEST"."N", value "50"
After line 29 in file c3545.sql

    insert into test values(3,  '4');
    insert into test values(3,'399');
    insert into test values(4, '50');
Statement failed, SQLSTATE = 23000
validation error for column "TEST"."N", value "50"
After line 33 in file c3545.sql


    select * from test;

ID                              1
N                               4

ID                              2
N                               399

ID                              3
N                               4

ID                              3
N                               399


    commit;


    set term ^;
    execute block returns(o1 dm_nums, o2 dm_nums, o3 dm_nums) as
    begin
      o1 = '4';
      o2 = '399';
      o3 = '50';
      suspend;
    end
    ^

Statement failed, SQLSTATE = 42000
validation error for variable O3, value "50"
After line 41 in file c3545.sql

    execute block returns(o1 dm_nums, o2 dm_nums, o3 dm_nums) as
    begin
      o1 = 4;
      o2 = 399;
      o3 = 50;
      suspend;
    end
    ^

Statement failed, SQLSTATE = 42000
validation error for variable O3, value "50"
After line 49 in file c3545.sql
    set term ;^
===

Compare with WI-V2.5.5.26871:
===
    show collation;
CO_NUMS, CHARACTER SET UTF8, FROM EXTERNAL ('UNICODE'), PAD SPACE, 
'NUMERIC-SORT=1'

    show domain;
       DM_NUMS                         
    show table test;
ID                              INTEGER Nullable 
N                               (DM_NUMS) VARCHAR(3) CHARACTER SET UTF8 
Nullable 
                                check (value < '50')
                                 COLLATE CO_NUMS

    insert into test values(1,   4);
    insert into test values(2, 399);
Statement failed, SQLSTATE = 23000
validation error for column "TEST"."N", value "399"
After line 28 in file c3545.sql
    insert into test values(2,  50);
Statement failed, SQLSTATE = 23000
validation error for column "TEST"."N", value "50"
After line 29 in file c3545.sql

    insert into test values(3,  '4');
    insert into test values(3,'399');
Statement failed, SQLSTATE = 23000
validation error for column "TEST"."N", value "399"
After line 32 in file c3545.sql
    insert into test values(4, '50');
Statement failed, SQLSTATE = 23000
validation error for column "TEST"."N", value "50"
After line 33 in file c3545.sql


    select * from test;

ID                              1
N                               4

ID                              3
N                               4


    commit;


    set term ^;
    execute block returns(o1 dm_nums, o2 dm_nums, o3 dm_nums) as
    begin
      o1 = '4';
      o2 = '399';
      o3 = '50';
      suspend;
    end
    ^

Statement failed, SQLSTATE = 42000
validation error for variable O3, value "50"
After line 41 in file c3545.sql

    execute block returns(o1 dm_nums, o2 dm_nums, o3 dm_nums) as
    begin
      o1 = 4;
      o2 = 399;
      o3 = 50;
      suspend;
    end
    ^

Statement failed, SQLSTATE = 42000
validation error for variable O2, value "399"
After line 49 in file c3545.sql
    set term ;^
===

Note: value "399" was denied in 2.5 but not in 3.0.

> Inconsistent domain's constraint validation in PSQL
> ---------------------------------------------------
>
>                 Key: CORE-3545
>                 URL: http://tracker.firebirdsql.org/browse/CORE-3545
>             Project: Firebird Core
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 3.0 Initial, 2.5.0
>            Reporter: Adriano dos Santos Fernandes
>            Assignee: Adriano dos Santos Fernandes
>             Fix For: 3.0 Alpha 1
>
>
> The domain's check constraint validation is done using the type of the 
> expression, instead of the type of the variable.
> Test case:
> create domain dx varchar(2) check (value < '5')!
> -- No error: ok
> execute block as
>   declare v1 dx = '40';
> begin
> end!
> -- Error: not ok - validation error for variable V1, value "40"
> execute block as
>   declare v1 dx = 40;
> begin
> end!

-- 
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

        

------------------------------------------------------------------------------
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to