Использование индексов в FB 2.5 совместно с CAST значения

WildSery
Дата: 14.08.2012 15:51:00
Я что-то пропустил новую фичу?

recreate table tbl1 (code varchar(20));
create index tbl1_idx1 on tbl1 (code);

insert into tbl1 values ('1');
insert into tbl1 values ('2');
insert into tbl1 values ('3');
insert into tbl1 values ('4');
insert into tbl1 values ('5');
insert into tbl1 values ('5a');
insert into tbl1 values ('6');
set statistics index tbl1_idx1;


LI-V2.0.5.13206 Firebird 2.0
select * from tbl1 where code = '5';
PLAN (TBL1 INDEX (TBL1_IDX1))

select * from tbl1 where code = 5;
PLAN (TBL1 INDEX (TBL1_IDX1))

LI-V2.5.1.26351 Firebird 2.5
select * from tbl1 where code = '5';
PLAN (TBL1 INDEX (TBL1_IDX1))

select * from tbl1 where code = 5;
PLAN (TBL1 NATURAL)
Симонов Денис
Дата: 14.08.2012 15:56:15
Было уже где-то.

Попробуй вот так

select * from tbl1 where code = cast(5 as varchar(20))
WildSery
Дата: 14.08.2012 16:37:27
Симонов Денис,

Я не спрашивал "как решить проблему". Вариантов решения могу напридумать самостоятельно.
Мне интересно, это так и должно быть, или "видимо, что-то случилось".
dimitr
Дата: 14.08.2012 17:29:58
так и должно быть. Уже не раз тут обсуждалось. Заодно обрати внимание на обратную ситуацию, когда индексированное поле - числовое, а искомый ключ - строковый литерал.
Гаджимурадов Рустам
Дата: 14.08.2012 18:03:05
WildSery
Мне интересно, это так и должно быть, или "видимо, что-то случилось".
Так должно быть, просто это было (и есть, наверное) не во всех аналогичных случаях.
У MSSQL-истов это IIRC даже входит в десятку "не забывайте как не надо делать". :)
Таблоид
Дата: 14.08.2012 18:32:13
dimitr
так и должно быть.
гм... а вот ТАК, как ниже показано, - тоже должно быть ?

C:\1INSTALL\FIREBIRD\FB_25>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'toc.fdb' default character set octets; commit;
SQL> recreate table tbl1 (code varchar(20));
SQL> create index tbl1_idx1 on tbl1 (code);
SQL> insert into tbl1 values ('1');
SQL> insert into tbl1 values ('2');
SQL> insert into tbl1 values ('3');
SQL> insert into tbl1 values ('4');
SQL> insert into tbl1 values ('5');
SQL> insert into tbl1 values ('5a'); -- буква 'a' - латинская
SQL> insert into tbl1 values ('6');
SQL> set statistics index tbl1_idx1;
SQL> commit;
SQL> set plan on;
SQL> select * from tbl1 where code = '5';

PLAN (TBL1 INDEX (TBL1_IDX1))

CODE
========================================
35 -- откудова это вылезло ?!

SQL>
SQL> select * from tbl1 where code = 5;

PLAN (TBL1 NATURAL)

CODE
========================================
35
Statement failed, SQLSTATE = 22018
conversion error from string "5a"

ЗЫ. WI-V2.5.2.26520
Dimitry Sibiryakov
Дата: 14.08.2012 18:34:34

Гаджимурадов Рустам
У MSSQL-истов это IIRC даже входит в десятку "не забывайте как не надо делать". :)

У ораклоидов тоже.

Posted via ActualForum NNTP Server 1.5

Гаджимурадов Рустам
Дата: 14.08.2012 18:39:48
Dimitry Sibiryakov
У ораклоидов тоже.
Да, наверное. Одни мы были "впереди планеты всей". Уже не впереди.
Таблоид
Дата: 14.08.2012 18:49:26
Таблоид
SQL> select * from tbl1 where code = '5';

PLAN (TBL1 INDEX (TBL1_IDX1))

CODE
========================================
35 -- откудова это вылезло ?!


Нашёл:
SQL> select code from tbl1;

CODE
============================
31
32
33
34
35
3561
36

SQL> select cast(code as varchar(20) character set win1251) s from tbl1;

S
====================
1
2
3
4
5
5a
6