From ef12ab9aaab97b46bcf00a0f624d28004152e06a Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Tue, 11 Oct 2022 07:38:10 +0200 Subject: [PATCH] Properly support CONCAT in Postgres and SQLite --- pkg/cast2/slice.go | 12 ++++++++++++ store/adapters/rdbms/drivers/postgres/dialect.go | 12 ++++++++++++ store/adapters/rdbms/drivers/sqlite/dialect.go | 7 +++++++ 3 files changed, 31 insertions(+) create mode 100644 pkg/cast2/slice.go diff --git a/pkg/cast2/slice.go b/pkg/cast2/slice.go new file mode 100644 index 000000000..e27952620 --- /dev/null +++ b/pkg/cast2/slice.go @@ -0,0 +1,12 @@ +package cast2 + +// Anys converts any kinds of values to a []any slice +func Anys[C any](in ...C) (out []any) { + out = make([]any, len(in)) + + for i := range in { + out[i] = in[i] + } + + return +} diff --git a/store/adapters/rdbms/drivers/postgres/dialect.go b/store/adapters/rdbms/drivers/postgres/dialect.go index fe07e070c..f84153fdc 100644 --- a/store/adapters/rdbms/drivers/postgres/dialect.go +++ b/store/adapters/rdbms/drivers/postgres/dialect.go @@ -10,6 +10,7 @@ import ( "github.com/doug-martin/goqu/v9/dialect/postgres" "github.com/doug-martin/goqu/v9/exp" "github.com/spf13/cast" + "strings" ) type ( @@ -185,5 +186,16 @@ func (postgresDialect) AttributeToColumn(attr *dal.Attribute) (col *ddl.Column, } func (postgresDialect) ExprHandler(n *ql.ASTNode, args ...exp.Expression) (exp.Expression, error) { + switch strings.ToLower(n.Ref) { + case "concat": + // need to force text type on all arguments + aa := make([]any, len(args)) + for a := range args { + aa[a] = exp.NewCastExpression(exp.NewLiteralExpression("?", args[a]), "TEXT") + } + + return exp.NewSQLFunctionExpression("CONCAT", aa...), nil + } + return ref2exp.RefHandler(n, args...) } diff --git a/store/adapters/rdbms/drivers/sqlite/dialect.go b/store/adapters/rdbms/drivers/sqlite/dialect.go index 3faf24cca..e14988ba0 100644 --- a/store/adapters/rdbms/drivers/sqlite/dialect.go +++ b/store/adapters/rdbms/drivers/sqlite/dialect.go @@ -2,6 +2,7 @@ package sqlite import ( "fmt" + "github.com/cortezaproject/corteza-server/pkg/cast2" "github.com/cortezaproject/corteza-server/pkg/dal" "github.com/cortezaproject/corteza-server/store/adapters/rdbms/ddl" "github.com/cortezaproject/corteza-server/store/adapters/rdbms/drivers" @@ -9,6 +10,7 @@ import ( "github.com/doug-martin/goqu/v9" "github.com/doug-martin/goqu/v9/dialect/sqlite3" "github.com/doug-martin/goqu/v9/exp" + "strings" ) type ( @@ -158,5 +160,10 @@ func (sqliteDialect) AttributeToColumn(attr *dal.Attribute) (col *ddl.Column, er } func (sqliteDialect) ExprHandler(n *ql.ASTNode, args ...exp.Expression) (exp.Expression, error) { + switch strings.ToLower(n.Ref) { + case "concat": + return exp.NewLiteralExpression("?"+strings.Repeat(" || ?", len(args)-1), cast2.Anys(args...)...), nil + } + return ref2exp.RefHandler(n, args...) }