Thanks for your answer.

I made some tests and found some strange exceptions to the rules you 
described.

Consider the following DDL sentences, which create four fields with the 
for possible combinations for default value and not null constraint:

alter table table1 add test1 integer;
alter table table1 add test2 integer not null;
alter table table1 add test3 integer default 3;
alter table table1 add test4 integer default 4 not null;

Given the following select sentence:

select distinct test1, test2, test3, test4,
   iif(test1 is null,1,0) as t1,
   iif(test2 is null,1,0) as t2,
   iif(test3 is null,1,0) as t3,
   iif(test4 is null,1,0) as t4
   from table1;

you get the following row:

test1    test2  test3     test4  t1   t2  t3   t4
[null]    0        [null]     4        1    1    1    0

So it seems that, when there is no not null constraint (test1 and 
test3), the engine returns null in select clauses as well as when 
comparing values. The default value of t3 is not used.
On the other hand, when there is a not null constraint, you have two cases:
   there is a default (test4): The engine uses this default for selects 
and when comparing values.
   there is no default (test2): It returns 0 for selects but uses null 
value for comparing operations.

Of course, we are always speaking in the case that no field value exists 
in the returned record version.

As you can see, default value are only assumed when there is a not null 
constraint.
A strange behavior is seen in the combination not null and no default 
value. It is returned as a 0 for selects but treated as a NULL when 
comparing.

Thanks for any answer.
Aldo Caruso


El 10/02/18 a las 13:48, Dimitry Sibiryakov s...@ibphoenix.com 
[firebird-support] escribió:
> 10.02.2018 16:32, Aldo Caruso aldo.car...@argencasas.com [firebird-support] 
> wrote:
>> I discovered that when a field is added to a table with a NOT NULL
>> constraint and a default value, it is automatically filled with that
>> default value.
>     No, it isn't. It would be too slow.
>     Default value is returned by select if no field value exists in returned 
> record
> version. Engine works about this way:
> 1) Prepare buffer for returned values and fill it with default values.
> 2) Replace values in the buffer with values extracted from storage.
> 3) Send the buffer to client side.
>
>

  • [firebird-s... Aldo Caruso aldo.car...@argencasas.com [firebird-support]
    • Re: [f... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]
      • Re... Aldo Caruso aldo.car...@argencasas.com [firebird-support]
        • ... Dmitry Yemanov dim...@users.sourceforge.net [firebird-support]
          • ... Aldo Caruso aldo.car...@argencasas.com [firebird-support]
    • Re: [f... Helen Borrie hele...@iinet.net.au [firebird-support]
      • Re... Aldo Caruso aldo.car...@argencasas.com [firebird-support]
        • ... Helen Borrie hele...@iinet.net.au [firebird-support]
          • ... Aldo Caruso aldo.car...@argencasas.com [firebird-support]
      • Re... Aldo Caruso aldo.car...@argencasas.com [firebird-support]

Reply via email to