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].