2015-05-07 20 views
5

DB: Firebird 2.5.4Utilizzando indice superiore calcolato in Firebird per confrontare le stringhe di caso insensitive

campo ho 1 tavolo, 2 campi stringa e 1 calcolato:

Files 
name varchar 256 
extension varchar 4 
filename computed by name||extension 

voglio cercare un nome di file in questa tabella (caso insensisive)

La query è

Select * 
from files f 
where upper(f.filename) = upper('test.txt') 

questo è il lavoro di Naturalmente, e per accelerare la query, ho creato un indice calcolato su file su upper(filename)

CREATE INDEX test ON FILES COMPUTED BY (upper(filename)); 

Ora, la stessa query non funziona più! Non restituisce nulla. Ho provato un indice in basso, ma non funziona neanche.

wtf? Ho perso un'opzione da qualche parte?

+0

A prima vista sembra un bug, vedrò se riesco a riprodurre (stasera, non ho accesso a un'istanza di Firebird adesso) –

+0

Ho modificato il post con una descrizione più completa di 2 minuti fa. –

+1

La settimana scorsa c'era un post sulla mailing list di supporto per firebird in cui qualcuno menzionava un problema simile con gli indici sulle colonne calcolate. Come soluzione alternativa potresti probabilmente rendere 'filename' una colonna normale e popolarla in un trigger su update e insert. –

risposta

4

Sembra che firebird non supporti gli indici calcolati sui campi calcolati. Ho sostituito il campo "nome file" calcolato con il nome regolare dei campi '|| estensione' nell'indice. Si risolve il problema: rapporto

CREATE INDEX test ON FILES COMPUTED BY (upper(name||extension)); 

Bug trovato here.

[EDIT]

Dopo aver cercato di individuare il problema, sembra il mio database ha errori interni, a causa della migrazione da una versione precedente. Mark Rotteveel mi indica le note di rilascio in cui viene descritto il problema:

http://www.firebirdsql.org/file/documentation/release_notes/html/rlsnotes254.html#notes-253

ho estratto i metadati e ricostruire l'intero database. Questo risolve il problema. Si noti che anche un backup e un ripristino dovrebbero funzionare.

Grazie Mark.

+0

Non è un bug. È una richiesta di funzionalità. :-) Personalmente non mi sarei aspettato un indice su una colonna non memorizzata. –

+0

Vedere la parte modificata del messaggio per la soluzione. Gli indici su colonne non memorizzate funzionano molto bene. –