Тест 1.SQL> create table t0(id int primary key, f01 int, f02 int, f03 computed by(f01+f02)); commit;
SQL> create index t0_f03 on t0 computed by(f03); commit;
SQL> insert into t0 values(1,100,200);
SQL> insert into t0 values(2,200,300);
SQL> commit;
SQL> show index;
RDB$PRIMARY3 UNIQUE INDEX ON T0(ID)
T0_F03 INDEX ON T0 COMPUTED BY (f03)
SQL> set plan on;
SQL> select * from t0 where f03>0;
PLAN (T0 NATURAL)
ID F01 F02 F03
============ ============ ============ =====================
1 100 200 300
2 200 300 500
ВОПРОС-1. Почему индекс оказался не задействован ? Да, я понимаю что вместо вычисляемого поля надо было просто создать computed_by-индекс по выражению и подставлять во where-условие это же выражение. Но во-первых, оно может оказаться весьма громоздким, так что вычисляемое поле само здесь просится; а во-вторых, это результат вычислений этого выражения часто надо видеть в селекте (при отладке) - опять-таки вычисляемое поле здесь проще всего указать, чем городить селект с карусадней.
Тест 2.SQL> create table t1(id int primary key, f01 int not null); commit;
SQL> create table t2(id int primary key, f02 generated always as((select f01 from t1 where t1.id=t2.id)) ); commit;
SQL> create unique index t2_unq on t2 computed by(f02); commit;
SQL> insert into t1 values(1, 100);
SQL> insert into t1 values(2, 100);
SQL> insert into t1 values(3, 100);
SQL> commit;
SQL> insert into t2(id) select id from t1;
SQL> commit;
SQL> show index;
RDB$PRIMARY4 UNIQUE INDEX ON T1(ID)
RDB$PRIMARY5 UNIQUE INDEX ON T2(ID)
T2_UNQ UNIQUE INDEX ON T2 COMPUTED BY (f02)
SQL> select * from t2;
ID F02
============ ============
1 100
2 100
3 100
ВОПРОС-2. Уникальность индекса T2_UNQ оказалась цинично нарушена. Это by design так или всё-таки это бага ?