Změny filtrování záznamů od verze 2017.2.0

Od verze 2017.2.0 došlo k úpravám filtrování záznamů. Tyto úpravy z velké části řeší nedokumentované chování při použití rozdílných datových typů vlastností a hodnot v podmínkách filtrů relačních operátorů.

Tabulka uvádí případy rozdílných výsledků filtrů oproti starším verzím:

př. dat. typ vlastnosti hodnota vlastnosti záznamu příklad filtrace dříve nyní správný zápis filtru
Změna návratového kódu chybně zadaného dotazu
A1 string 123444 kod = 123444 status kód 500 status kód 400 kod = '123444'
Porovnávání vlastnosti typu datum+čas
B1 datetime 2017-03-15T00:30:00 lastUpdate = 2017-03-15 vrací záznam nevrací záznam lastUpdate = 2017-03-15T00:30:00
B2 datetime 2017-03-15T00:00:00 lastUpdate = '2017-03-15' nevrací záznam vrací záznam lastUpdate = '2017-03-15'
B3 datetime 2017-03-15T00:30:00 lastUpdate > '2017-03-15 00:00:00' vrací záznam status kód 400 lastUpdate > 2017-03-15T00:00:00
Porovnání neřetězcové vlastnosti s řetězcem
C1 integer 1 pocetPriloh = '1.0' nevrací záznam vrací záznam pocetPriloh = '1.0'
C2 integer 10 pocetPriloh < '2' vrací záznam nevrací záznam
C3 numeric 1000.00 sumCelkem = '1000.0' nevrací záznam vrací záznam sumCelkem = '1000.0'
C4 numeric 1000.00 sumCelkem = '1 000,00' nevrací záznam status kód 400 sumCelkem = '1000.00'
C5 date 2017-03-15 datVyst = '15.3.2017' nevrací záznam status kód 400 datVyst = '2017-03-15'
C6 datetime 2017-03-15T00:00:00 lastUpdate = '15.3.2017' nevrací záznam status kód 400 lastUpdate = '2017-03-15'
C7 logic true zuctovano = 'ANO' nevrací záznam status kód 400 zuctovano = 'true'
Vlastnost typu řetězec porovnávána s logickou hodnotou
D1 string 'true' poznam = true vrací záznam status kód 400 poznam = 'true'
Vlastnost typu datum porovnávána s řetězcem datum+čas
E1 date 2017-03-15 datVyst = '2017-03-15T00:00:00' nevrací záznam vrací záznam datVyst = '2017-03-15T00:00:00'
Vlastnost typu select s řetězcovými operátory
F1 select stavUhr.uhrazeno stavUhrK begins 'STAVUHR.UHR' vrací záznam nevrací záznam stavUhrK begins 'stavUhr.uhr'

Změna návratového kódu chybně zadaného dotazu

Nejzřetelnější změnou verze 2017.2.0 je změna návratového status kódu a zpráv s popisem chyby v případech, kdy filtr nelze vyhodnotit z důvodu chybně použitých datových typů nebo chybných formátů datových typů v podmínce filtru. Nově je situace vyhodnocena jako chybně zadaný dotaz na straně klienta a vrací se status kód 400 Bad Request. Do verze 2017.2.0 se vracel status kód 500 Internal Server Error. Tato změna je obecná a týká se vlastností všech datových typů a všech operátorů ve filtrech [příklad A1].

Porovnávání vlastnosti typu datum+čas

Je-li typ vlastnosti datum+čas a hodnota ve filtru je typu datum nebo řetězec ve formátu datum, pak je hodnota ve filtru konvertována na typ datum+čas v čase 00:00:00. Do verze 2017.2.0. se v případě hodnoty typu datum porovnával pouze datum a časová složka hodnoty vlastnosti typu datum+čas byla ignorována [příklad B1]. V případě řetězce se hodnota vlastnosti konvertovala na řetězec a došlo k porovnání řetězců [příklad B2].

Porovnání neřetězcové vlastnosti s řetězcem

V případě relačních operátorů, kdy vlastnost není typu řetězec a ve filtru jí porovnáváme s řetězcem, tak dříve docházelo k řetězcovému vyhodnocování výrazů, což mohlo vést k neočekávaným výsledkům. Od verze 2017.2.0 dochází k implicitní konverzi řetězcových hodnot v podmínce filtru na datový typ vlastnosti:

  • Pokud typová konverze je možná, pak je řetězec v podmínce převeden na datový typ vlastnosti a dochází k vyhodnocení podmínky s návratovým kódem 200 [příklady C1, C2, C3].
  • Pokud typová konverze není možná, pak se vrací status kód 400 s hláškou “Filtr pro vlastnost … neodpovídající formátu …” [příklady C4, C5, C6, C7].

Do verze 2017.2.0 docházelo naopak ke konverzi hodnoty vlastnosti na řetězec a podmínka byla vyhodnocena porovnáním řetězců s návratovým status kódem 200. Výjimkou byl operátor IN, u kterého docházelo k implicitní konverzi řetězců v seznamu hodnot na datový typ vlastnosti. Pokud konverze nebyla možná, vracel se status kód 500.

Tato změna se dotýká vlastností datových typů celé číslo, desetinné číslo, datum, datum+čas a logic. Tedy všech mimo vlastností typu řetězec.

Vlastnost typu řetězec porovnávána s logickou hodnotou

Vlastnost typu řetězec, můžeme porovnávat pouze s řetězci. Pokud vlastnost typu řetězec neporovnáváme s řetězcem, ale hodnotou jiného datového typu, tak se vždy dotaz vyhodnotí jako chybný. Do verze 2017.2.0 bylo chování obdobné, ale existovala výjimka pro případ, kdy v podmínce filtru byla logická hodnota. V tomto případě byla logická hodnota konvertována na řetězec a došlo k porovnání řetězců [příklad D1].

Vlastnost typu datum porovnávána s řetězcem datum+čas

Porovnáváme-li hodnotu vlastnosti typ datum s hodnotou ve filtru, která je řetězec ve formátu datum+čas, pak se časová složka ignoruje a hodnota je konvertována na typ datum. Do verze 2017.2.0 byla konvertována hodnota datum ve vlastnosti na řetězec a došlo k porovnání řetězců [příklad E1].

Vlastnost typu select s řetězcovými operátory

Při použití řetězcových operátorů like, begins a ends stále platí, že hodnoty filtru musí být typu řetězec a neřetězcové vlastnosti jsou při vyhodnocování implicitně konvertovány na řetězec. Od verze 2017.2.0 je ale nutné při filtrování podle datového typu výběr jedné z hodnot (select) dodržet v hodnotě filtru správnou velikost písmen. Do verze 2017.2.0 mohly být hodnoty filtru case-insensitive [příklad F1].