7676 // strings.Replacer takes a sequence of old to new replacements
7777 escapeCharMap = []string {
7878 "'" , "''" ,
79- `"` , `\\"` ,
79+ " \" " , " \\ \" " ,
8080 "\b " , "\\ b" ,
8181 "\n " , "\\ n" ,
8282 "\r " , "\\ r" ,
@@ -277,7 +277,7 @@ func (c *QueryConverter) convertWhereExpr(expr *sqlparser.Expr) error {
277277 case * sqlparser.FuncExpr :
278278 return query .NewConverterError ("%s: function expression" , query .NotSupportedErrMessage )
279279 case * sqlparser.ColName :
280- return query .NewConverterError ("incomplete expression" )
280+ return query .NewConverterError ("%s: incomplete expression" , query . InvalidExpressionErrMessage )
281281 default :
282282 return query .NewConverterError ("%s: expression of type %T" , query .NotSupportedErrMessage , e )
283283 }
@@ -286,7 +286,7 @@ func (c *QueryConverter) convertWhereExpr(expr *sqlparser.Expr) error {
286286func (c * QueryConverter ) convertAndExpr (exprRef * sqlparser.Expr ) error {
287287 expr , ok := (* exprRef ).(* sqlparser.AndExpr )
288288 if ! ok {
289- return query .NewConverterError ("%v is not an 'and ' expression" , sqlparser .String (* exprRef ))
289+ return query .NewConverterError ("`%s` is not an 'AND ' expression" , sqlparser .String (* exprRef ))
290290 }
291291 err := c .convertWhereExpr (& expr .Left )
292292 if err != nil {
@@ -298,7 +298,7 @@ func (c *QueryConverter) convertAndExpr(exprRef *sqlparser.Expr) error {
298298func (c * QueryConverter ) convertOrExpr (exprRef * sqlparser.Expr ) error {
299299 expr , ok := (* exprRef ).(* sqlparser.OrExpr )
300300 if ! ok {
301- return query .NewConverterError ("%v is not an 'or ' expression" , sqlparser .String (* exprRef ))
301+ return query .NewConverterError ("`%s` is not an 'OR ' expression" , sqlparser .String (* exprRef ))
302302 }
303303 err := c .convertWhereExpr (& expr .Left )
304304 if err != nil {
@@ -310,19 +310,9 @@ func (c *QueryConverter) convertOrExpr(exprRef *sqlparser.Expr) error {
310310func (c * QueryConverter ) convertComparisonExpr (exprRef * sqlparser.Expr ) error {
311311 expr , ok := (* exprRef ).(* sqlparser.ComparisonExpr )
312312 if ! ok {
313- return query .NewConverterError ("%v is not a comparison expression" , sqlparser .String (* exprRef ))
314- }
315-
316- saName , saFieldName , err := c .convertColName (& expr .Left )
317- if err != nil {
318- return err
319- }
320- saType , err := c .saTypeMap .GetType (saFieldName )
321- if err != nil {
322313 return query .NewConverterError (
323- "%s: column name '%s' is not a valid search attribute" ,
324- query .InvalidExpressionErrMessage ,
325- saName ,
314+ "`%s` is not a comparison expression" ,
315+ sqlparser .String (* exprRef ),
326316 )
327317 }
328318
@@ -335,11 +325,16 @@ func (c *QueryConverter) convertComparisonExpr(exprRef *sqlparser.Expr) error {
335325 )
336326 }
337327
338- err = c .convertValueExpr (& expr .Right , saName , saType )
328+ saColNameExpr , err : = c .convertColName (& expr .Left )
339329 if err != nil {
340330 return err
341331 }
342- switch saType {
332+
333+ err = c .convertValueExpr (& expr .Right , saColNameExpr .alias , saColNameExpr .valueType )
334+ if err != nil {
335+ return err
336+ }
337+ switch saColNameExpr .valueType {
343338 case enumspb .INDEXED_VALUE_TYPE_KEYWORD_LIST :
344339 newExpr , err := c .convertKeywordListComparisonExpr (expr )
345340 if err != nil {
@@ -360,74 +355,79 @@ func (c *QueryConverter) convertRangeCond(exprRef *sqlparser.Expr) error {
360355 expr , ok := (* exprRef ).(* sqlparser.RangeCond )
361356 if ! ok {
362357 return query .NewConverterError (
363- "%v is not a range condition expression" ,
358+ "`%s` is not a range condition expression" ,
364359 sqlparser .String (* exprRef ),
365360 )
366361 }
367- saName , saFieldName , err := c .convertColName (& expr .Left )
362+ saColNameExpr , err := c .convertColName (& expr .Left )
368363 if err != nil {
369364 return err
370365 }
371- saType , err := c .saTypeMap .GetType (saFieldName )
372- if err != nil {
373- return query .NewConverterError (
374- "%s: column name '%s' is not a valid search attribute" ,
375- query .InvalidExpressionErrMessage ,
376- saName ,
377- )
378- }
379- if ! isSupportedTypeRangeCond (saType ) {
366+ if ! isSupportedTypeRangeCond (saColNameExpr .valueType ) {
380367 return query .NewConverterError (
381368 "%s: cannot do range condition on search attribute '%s' of type %s" ,
382369 query .InvalidExpressionErrMessage ,
383- saName ,
384- saType .String (),
370+ saColNameExpr . alias ,
371+ saColNameExpr . valueType .String (),
385372 )
386373 }
387- err = c .convertValueExpr (& expr .From , saName , saType )
374+ err = c .convertValueExpr (& expr .From , saColNameExpr . alias , saColNameExpr . valueType )
388375 if err != nil {
389376 return err
390377 }
391- err = c .convertValueExpr (& expr .To , saName , saType )
378+ err = c .convertValueExpr (& expr .To , saColNameExpr . alias , saColNameExpr . valueType )
392379 if err != nil {
393380 return err
394381 }
395382 return nil
396383}
397384
398- func (c * QueryConverter ) convertColName (
399- exprRef * sqlparser.Expr ,
400- ) (saAlias string , saFieldName string , retError error ) {
385+ func (c * QueryConverter ) convertColName (exprRef * sqlparser.Expr ) (* saColName , error ) {
401386 expr , ok := (* exprRef ).(* sqlparser.ColName )
402387 if ! ok {
403- return "" , "" , query .NewConverterError (
388+ return nil , query .NewConverterError (
404389 "%s: must be a column name but was %T" ,
405390 query .InvalidExpressionErrMessage ,
406391 * exprRef ,
407392 )
408393 }
409- saAlias = strings .ReplaceAll (sqlparser .String (expr ), "`" , "" )
410- saFieldName = saAlias
394+ saAlias : = strings .ReplaceAll (sqlparser .String (expr ), "`" , "" )
395+ saFieldName : = saAlias
411396 if searchattribute .IsMappable (saAlias ) {
412397 var err error
413398 saFieldName , err = c .saMapper .GetFieldName (saAlias , c .namespaceName .String ())
414399 if err != nil {
415- return "" , "" , query .NewConverterError (
400+ return nil , query .NewConverterError (
416401 "%s: column name '%s' is not a valid search attribute" ,
417402 query .InvalidExpressionErrMessage ,
418403 saAlias ,
419404 )
420405 }
421406 }
407+ saType , err := c .saTypeMap .GetType (saFieldName )
408+ if err != nil {
409+ // This should never happen since it came from mapping.
410+ return nil , query .NewConverterError (
411+ "%s: column name '%s' is not a valid search attribute" ,
412+ query .InvalidExpressionErrMessage ,
413+ saAlias ,
414+ )
415+ }
422416 if saFieldName == searchattribute .TemporalNamespaceDivision {
423417 c .seenNamespaceDivision = true
424418 }
425- var newExpr sqlparser.Expr = newColName (searchattribute .GetSqlDbColName (saFieldName ))
426419 if saAlias == searchattribute .CloseTime {
427- newExpr = c .getCoalesceCloseTimeExpr ()
428- }
420+ * exprRef = c .getCoalesceCloseTimeExpr ()
421+ return closeTimeSaColName , nil
422+ }
423+ newExpr := newSAColName (
424+ searchattribute .GetSqlDbColName (saFieldName ),
425+ saAlias ,
426+ saFieldName ,
427+ saType ,
428+ )
429429 * exprRef = newExpr
430- return saAlias , saFieldName , nil
430+ return newExpr , nil
431431}
432432
433433func (c * QueryConverter ) convertValueExpr (
@@ -573,20 +573,12 @@ func (c *QueryConverter) parseSQLVal(
573573func (c * QueryConverter ) convertIsExpr (exprRef * sqlparser.Expr ) error {
574574 expr , ok := (* exprRef ).(* sqlparser.IsExpr )
575575 if ! ok {
576- return query .NewConverterError ("%v is not an 'IS' expression" , sqlparser .String (* exprRef ))
576+ return query .NewConverterError ("`%s` is not an 'IS' expression" , sqlparser .String (* exprRef ))
577577 }
578- saName , saFieldName , err := c .convertColName (& expr .Expr )
578+ _ , err := c .convertColName (& expr .Expr )
579579 if err != nil {
580580 return err
581581 }
582- _ , err = c .saTypeMap .GetType (saFieldName )
583- if err != nil {
584- return query .NewConverterError (
585- "%s: column name '%s' is not a valid search attribute" ,
586- query .InvalidExpressionErrMessage ,
587- saName ,
588- )
589- }
590582 switch expr .Operator {
591583 case sqlparser .IsNullStr , sqlparser .IsNotNullStr :
592584 // no-op
0 commit comments