11using System ;
22using System . Text ;
33using SQLite ;
4+ using System . Collections . Generic ;
45
56#if ! PORTABLE
67using System . Runtime . CompilerServices ;
@@ -275,6 +276,7 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
275276 string prefix = null ;
276277 string between = null ;
277278 string postfix = null ;
279+ bool unquote = false ;
278280
279281 switch ( expression . FunctionType )
280282 {
@@ -286,13 +288,15 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
286288 between = " || " ;
287289 break ;
288290 case FilterExpressionFunctionType . Contains :
291+ unquote = true ;
289292 between = " LIKE '%" ;
290293 postfix = "%'" ;
291294 break ;
292295 case FilterExpressionFunctionType . Day :
293296 throw new NotImplementedException ( ) ;
294297 break ;
295298 case FilterExpressionFunctionType . EndsWith :
299+ unquote = true ;
296300 between = " LIKE '%" ;
297301 postfix = "'" ;
298302 break ;
@@ -324,6 +328,7 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
324328 throw new NotImplementedException ( ) ;
325329 break ;
326330 case FilterExpressionFunctionType . StartsWith :
331+ unquote = true ;
327332 between = " LIKE '" ;
328333 postfix = "%'" ;
329334 break ;
@@ -351,7 +356,6 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
351356 }
352357 if ( prefix != null )
353358 {
354- _sb . Append ( "(" ) ;
355359 _sb . Append ( prefix ) ;
356360 }
357361 bool first = true ;
@@ -373,7 +377,10 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
373377 _sb . Append ( ", " ) ;
374378 }
375379 }
380+
381+ SuppressQuotes ( true ) ;
376382 Visit ( expression . FunctionArguments [ i ] ) ;
383+ UnsuppressQuotes ( ) ;
377384 }
378385
379386 if ( functionName != null )
@@ -383,14 +390,34 @@ public override void VisitFunctionExpression(FunctionFilterExpression expression
383390 if ( postfix != null )
384391 {
385392 _sb . Append ( postfix ) ;
386- _sb . Append ( ")" ) ;
387393 }
388394 }
389395
390- /// <summary>
391- /// Visits a literal expression.
392- /// </summary>
393- /// <param name="expression">The literal expression to visit.</param>
396+ private Stack < bool > _quotesSuppressed = new Stack < bool > ( ) ;
397+ private void UnsuppressQuotes ( )
398+ {
399+ _quotesSuppressed . Pop ( ) ;
400+ }
401+
402+ private void SuppressQuotes ( bool suppress )
403+ {
404+ _quotesSuppressed . Push ( suppress ) ;
405+ }
406+
407+ private bool AreQuotesSuppressed ( )
408+ {
409+ if ( _quotesSuppressed . Count == 0 || ! _quotesSuppressed . Peek ( ) )
410+ {
411+ return false ;
412+ }
413+
414+ return true ;
415+ }
416+
417+ /// <summary>
418+ /// Visits a literal expression.
419+ /// </summary>
420+ /// <param name="expression">The literal expression to visit.</param>
394421 public override void VisitLiteralExpression ( LiteralFilterExpression expression )
395422 {
396423 RenderLiteral ( expression , expression . LiteralValue ) ;
@@ -400,11 +427,25 @@ private void RenderLiteral(LiteralFilterExpression expression, object literalVal
400427 {
401428 var value = _literalEmitter . EmitLiteral ( literalValue , expression . LeaveUnquoted ) ;
402429
430+ if ( AreQuotesSuppressed ( ) && value is string )
431+ {
432+ if ( value . StartsWith ( "'" ) && value . EndsWith ( "'" ) )
433+ {
434+ value = value . Substring ( 1 , value . Length - 2 ) ;
435+ }
436+ }
437+ if ( AreQuotesSuppressed ( ) && value is string )
438+ {
439+ if ( value . StartsWith ( "\" " ) && value . EndsWith ( "\" " ) )
440+ {
441+ value = value . Substring ( 1 , value . Length - 2 ) ;
442+ }
443+ }
403444 //TODO: need to do special stuff here for dates etc.
404445
405- // JM 02-01-2016 - Graham: Please review this
406- //if (literalValue is DateTime || literalValue is DateTimeOffset)
407- // value = "datetime'" + value + "'";
446+ // JM 02-01-2016 - Graham: Please review this
447+ //if (literalValue is DateTime || literalValue is DateTimeOffset)
448+ // value = "datetime'" + value + "'";
408449
409450 _sb . Append ( value ) ;
410451 }
0 commit comments