diff --git a/server/store/adapters/rdbms/dal/model.go b/server/store/adapters/rdbms/dal/model.go index e71f28522..303ac1fec 100644 --- a/server/store/adapters/rdbms/dal/model.go +++ b/server/store/adapters/rdbms/dal/model.go @@ -112,6 +112,7 @@ func (d *model) convertQuery(n *ql.ASTNode) (out exp.Expression, err error) { func (d *model) QueryParser() queryParser { return ql.Converter( ql.SymHandler(d.qlConverterGenericSymHandler()), + ql.ValHandler(d.qlConverterGenericValHandler()), ql.RefHandler(d.qlConverterGenericRefHandler()), ) } @@ -151,6 +152,12 @@ func (d *model) qlConverterGenericSymHandler() func(node *ql.ASTNode) (exp.Expre } } +func (d *model) qlConverterGenericValHandler() func(*ql.ASTNode) (exp.Expression, error) { + return func(node *ql.ASTNode) (exp.Expression, error) { + return d.dialect.ValHandler(node) + } +} + func (d *model) qlConverterGenericRefHandler() func(*ql.ASTNode, ...exp.Expression) (exp.Expression, error) { return func(node *ql.ASTNode, args ...exp.Expression) (exp.Expression, error) { return d.dialect.ExprHandler(node, args...) diff --git a/server/store/adapters/rdbms/drivers/dialect.go b/server/store/adapters/rdbms/drivers/dialect.go index 4d35708b3..51f4fb7b2 100644 --- a/server/store/adapters/rdbms/drivers/dialect.go +++ b/server/store/adapters/rdbms/drivers/dialect.go @@ -77,6 +77,9 @@ type ( // ExprHandler returns driver specific expression handling ExprHandler(*ql.ASTNode, ...exp.Expression) (exp.Expression, error) + // ValHandler returns driver specific value expression handling + ValHandler(*ql.ASTNode) (exp.Expression, error) + // OrderedExpression returns compatible expression for ordering // // Database understand order modifiers differently. For example, MySQL does not know diff --git a/server/store/adapters/rdbms/drivers/mysql/dialect.go b/server/store/adapters/rdbms/drivers/mysql/dialect.go index 69c38b8bf..3c737f6c8 100644 --- a/server/store/adapters/rdbms/drivers/mysql/dialect.go +++ b/server/store/adapters/rdbms/drivers/mysql/dialect.go @@ -242,6 +242,10 @@ func (d mysqlDialect) ExprHandler(n *ql.ASTNode, args ...exp.Expression) (expr e return ql.DefaultRefHandler(n, args...) } +func (d mysqlDialect) ValHandler(n *ql.ASTNode) (out exp.Expression, err error) { + return ql.DefaultValueHandler(n) +} + func (d mysqlDialect) OrderedExpression(expr exp.Expression, dir exp.SortDirection, _ exp.NullSortType) exp.OrderedExpression { return exp.NewOrderedExpression(expr, dir, exp.NoNullsSortType) } diff --git a/server/store/adapters/rdbms/drivers/postgres/dialect.go b/server/store/adapters/rdbms/drivers/postgres/dialect.go index 3e6418f0f..ceb1a42dd 100644 --- a/server/store/adapters/rdbms/drivers/postgres/dialect.go +++ b/server/store/adapters/rdbms/drivers/postgres/dialect.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/cortezaproject/corteza/server/pkg/dal" + "github.com/cortezaproject/corteza/server/pkg/expr" "github.com/cortezaproject/corteza/server/store/adapters/rdbms/ddl" "github.com/cortezaproject/corteza/server/store/adapters/rdbms/drivers" "github.com/cortezaproject/corteza/server/store/adapters/rdbms/ql" @@ -235,6 +236,23 @@ func (d postgresDialect) ExprHandler(n *ql.ASTNode, args ...exp.Expression) (exp return ref2exp.RefHandler(n, args...) } +func (d postgresDialect) ValHandler(n *ql.ASTNode) (out exp.Expression, err error) { + switch v := n.Value.V.(type) { + case *expr.Boolean: + // value handling for boolean is different in postgres + // this was done to support value parsing for (IS $3) statement + if cast.ToBool(v.Get()) { + out = drivers.LiteralTRUE + } else { + out = drivers.LiteralFALSE + } + default: + out = exp.NewLiteralExpression("?", n.Value.V.Get()) + } + + return +} + func (d postgresDialect) OrderedExpression(expr exp.Expression, dir exp.SortDirection, nst exp.NullSortType) exp.OrderedExpression { return exp.NewOrderedExpression(expr, dir, nst) } diff --git a/server/store/adapters/rdbms/drivers/sqlite/dialect.go b/server/store/adapters/rdbms/drivers/sqlite/dialect.go index 06b144d31..a5d7a472d 100644 --- a/server/store/adapters/rdbms/drivers/sqlite/dialect.go +++ b/server/store/adapters/rdbms/drivers/sqlite/dialect.go @@ -234,6 +234,10 @@ func (d sqliteDialect) ExprHandler(n *ql.ASTNode, args ...exp.Expression) (expr return ref2exp.RefHandler(n, args...) } +func (d sqliteDialect) ValHandler(n *ql.ASTNode) (out exp.Expression, err error) { + return ql.DefaultValueHandler(n) +} + func (d sqliteDialect) OrderedExpression(expr exp.Expression, dir exp.SortDirection, nst exp.NullSortType) exp.OrderedExpression { return exp.NewOrderedExpression(expr, dir, exp.NoNullsSortType) }