dialect/sql: skip formatting qualified columns (#3469)

This commit is contained in:
Ariel Mashraki
2023-04-11 13:16:40 +03:00
committed by GitHub
parent da69615bd0
commit 36cd6a8a8b
2 changed files with 38 additions and 0 deletions

View File

@@ -2612,6 +2612,10 @@ func (s *Selector) Prefix(queries ...Querier) *Selector {
// C returns a formatted string for a selected column from this statement.
func (s *Selector) C(column string) string {
// Skip formatting qualified columns.
if s.isQualified(column) {
return column
}
if s.as != "" {
b := &Builder{dialect: s.dialect}
b.Ident(s.as)
@@ -3723,6 +3727,14 @@ func (b *Builder) isIdent(s string) bool {
}
}
// isIdent reports if the given string is a qualified identifier.
func (b *Builder) isQualified(s string) bool {
ident, pg := b.isIdent(s), b.postgres()
return !ident && len(s) > 2 && strings.ContainsRune(s[1:len(s)-1], '.') || // <qualifier>.<column>
ident && pg && strings.Contains(s, `"."`) || // "qualifier"."column"
ident && !pg && strings.Contains(s, "`.`") // `qualifier`.`column`
}
// state wraps the all methods for setting and getting
// update state between all queries in the query tree.
type state interface {

View File

@@ -2411,3 +2411,29 @@ func TestSelector_JoinedTableView(t *testing.T) {
require.True(t, ok)
require.Equal(t, "`t4`.`c`", t4.C("c"))
}
func TestSelector_Columns(t *testing.T) {
t.Run("MySQL", func(t *testing.T) {
s := Select("*").From(Table("users"))
require.Equal(t, []string{"`users`.`c`"}, s.Columns("c"))
// Already quoted.
require.Equal(t, []string{"`users`.`c`"}, s.Columns("`c`"))
t2 := Table("t2").As("t2")
s.Join(t2)
// Already quoted.
require.Equal(t, []string{"`t2`.`c1`"}, s.Columns(t2.C("c1")))
require.Equal(t, []string{"t2.c1"}, s.Columns("t2.c1"))
})
t.Run("Postgres", func(t *testing.T) {
b := Dialect(dialect.Postgres)
s := b.Select("*").From(Table("users"))
require.Equal(t, []string{`"users"."c"`}, s.Columns("c"))
// Already quoted.
require.Equal(t, []string{`"users"."c"`}, s.Columns(`"c"`))
t2 := b.Table("t2").As("t2")
s.Join(t2)
// Already quoted.
require.Equal(t, []string{`"t2"."c1"`}, s.Columns(t2.C("c1")))
require.Equal(t, []string{"t2.c1"}, s.Columns("t2.c1"))
})
}