From 604c4942a4cd1df6ab78f8174bef40c5fefdd6dd Mon Sep 17 00:00:00 2001 From: Pedro Henrique Date: Thu, 26 Jan 2023 04:43:07 -0300 Subject: [PATCH] dialect/sql: improve support for subqueries (#3274) --- dialect/sql/builder.go | 20 +++++++++++++++++++- dialect/sql/builder_test.go | 11 +++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/dialect/sql/builder.go b/dialect/sql/builder.go index e80e6dd57..65c2e2683 100644 --- a/dialect/sql/builder.go +++ b/dialect/sql/builder.go @@ -2367,7 +2367,25 @@ func (s *Selector) Table() *SelectTable { if len(s.from) == 0 { return nil } - return s.from[0].(*SelectTable) + return selectTable(s.from[0]) +} + +// selectTable returns a *SelectTable from the given TableView. +func selectTable(tb TableView) *SelectTable { + if tb == nil { + return nil + } + switch view := tb.(type) { + case *SelectTable: + return view + case *Selector: + if len(view.from) == 0 { + return nil + } + return selectTable(view.from[0]) + default: + panic(fmt.Sprintf("unhandled TableView type %T", tb)) + } } // TableName returns the name of the selected table or alias of selector. diff --git a/dialect/sql/builder_test.go b/dialect/sql/builder_test.go index ea72ac291..d49641eb4 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -2355,3 +2355,14 @@ func TestMultipleFrom(t *testing.T) { require.Equal(t, []any{"neutrino|(dark & matter)", 10}, args) require.Equal(t, `SELECT items.*, ts_rank_cd(search, search_query) AS "rank" FROM "items", to_tsquery($1) AS search_query WHERE "value" = $2 AND search @@ search_query`, query) } + +func TestFormattedColumnFromSubQuery(t *testing.T) { + q := Select("*").From(Select("*").AppendSelectExprAs(P(func(b *Builder) { + b.SetDialect(dialect.Postgres) + b.WriteString("calculate_score") + b.Wrap(func(bb *Builder) { + bb.WriteString(Table("table_name").C("field_name")).Comma().Args("test") + }) + }), "score").From(Table("table_name").As("table_name_alias"))) + require.Equal(t, "`table_name_alias`.`score`", q.C("score")) +}