@@ -4036,6 +4036,8 @@ int msPostGISLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *
4036
4036
msFree (snippet );
4037
4037
msFree (stresc );
4038
4038
} else if (filter -> type == MS_EXPRESSION ) {
4039
+ int ieq_expected = MS_FALSE ;
4040
+
4039
4041
if (msPostGISParseData (layer ) != MS_SUCCESS ) return MS_FAILURE ;
4040
4042
4041
4043
if (layer -> debug >= 2 ) msDebug ("msPostGISLayerTranslateFilter. String: %s.\n" , filter -> string );
@@ -4050,7 +4052,9 @@ int msPostGISLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *
4050
4052
*/
4051
4053
if (node -> token == MS_TOKEN_BINDING_TIME ) {
4052
4054
bindingToken = node -> token ;
4053
- } else if (node -> token == MS_TOKEN_COMPARISON_EQ || node -> token == MS_TOKEN_COMPARISON_NE ||
4055
+ } else if (node -> token == MS_TOKEN_COMPARISON_EQ ||
4056
+ node -> token == MS_TOKEN_COMPARISON_IEQ ||
4057
+ node -> token == MS_TOKEN_COMPARISON_NE ||
4054
4058
node -> token == MS_TOKEN_COMPARISON_GT || node -> token == MS_TOKEN_COMPARISON_GE ||
4055
4059
node -> token == MS_TOKEN_COMPARISON_LT || node -> token == MS_TOKEN_COMPARISON_LE ||
4056
4060
node -> token == MS_TOKEN_COMPARISON_IN ) {
@@ -4101,7 +4105,10 @@ int msPostGISLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *
4101
4105
4102
4106
msFreeCharArray (strings , nstrings );
4103
4107
} else {
4104
- strtmpl = "'%s'" ;
4108
+ if (comparisonToken == MS_TOKEN_COMPARISON_IEQ )
4109
+ strtmpl = "lower('%s')" ;
4110
+ else
4111
+ strtmpl = "'%s'" ;
4105
4112
stresc = msPostGISEscapeSQLParam (layer , node -> tokenval .strval );
4106
4113
snippet = (char * ) msSmallMalloc (strlen (strtmpl ) + strlen (stresc ));
4107
4114
sprintf (snippet , strtmpl , stresc );
@@ -4149,7 +4156,11 @@ int msPostGISLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *
4149
4156
case MS_TOKEN_BINDING_DOUBLE :
4150
4157
case MS_TOKEN_BINDING_INTEGER :
4151
4158
case MS_TOKEN_BINDING_STRING :
4152
- if (node -> token == MS_TOKEN_BINDING_STRING || node -> next -> token == MS_TOKEN_COMPARISON_RE || node -> next -> token == MS_TOKEN_COMPARISON_IRE )
4159
+ if (node -> token == MS_TOKEN_BINDING_STRING && node -> next -> token == MS_TOKEN_COMPARISON_IEQ ) {
4160
+ strtmpl = "lower(%s::text)" ;
4161
+ ieq_expected = MS_TRUE ;
4162
+ }
4163
+ else if (node -> token == MS_TOKEN_BINDING_STRING || node -> next -> token == MS_TOKEN_COMPARISON_RE || node -> next -> token == MS_TOKEN_COMPARISON_IRE )
4153
4164
strtmpl = "%s::text" ; /* explicit cast necessary for certain operators */
4154
4165
else
4155
4166
strtmpl = "%s" ;
@@ -4195,8 +4206,19 @@ int msPostGISLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *
4195
4206
native_string = msStringConcatenate (native_string , msExpressionTokenToString (node -> token ));
4196
4207
break ;
4197
4208
4198
- /* unsupported tokens */
4199
4209
case MS_TOKEN_COMPARISON_IEQ :
4210
+ if ( ieq_expected )
4211
+ {
4212
+ native_string = msStringConcatenate (native_string , "=" );
4213
+ ieq_expected = MS_FALSE ;
4214
+ }
4215
+ else
4216
+ {
4217
+ goto cleanup ;
4218
+ }
4219
+ break ;
4220
+
4221
+ /* unsupported tokens */
4200
4222
case MS_TOKEN_COMPARISON_BEYOND :
4201
4223
case MS_TOKEN_FUNCTION_TOSTRING :
4202
4224
case MS_TOKEN_FUNCTION_ROUND :
0 commit comments