mirror of
https://github.com/ent/ent.git
synced 2026-05-22 09:31:45 +03:00
dialect/sql: skip formatting qualified columns (#3469)
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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"))
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user