Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 26a0ec9

Browse files
authored
sql/analyzer: back-propagate expression names after adding convert (#739)
sql/analyzer: back-propagate expression names after adding convert
2 parents 572d64b + 71819b4 commit 26a0ec9

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

sql/analyzer/convert_dates.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,12 @@ func convertDates(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) {
5454
if err != nil {
5555
return nil, err
5656
}
57+
5758
aggregate[i] = agg
59+
60+
if _, ok := agg.(*expression.Alias); !ok && agg.String() != a.String() {
61+
nodeReplacements[tableCol{"", a.String()}] = agg.String()
62+
}
5863
}
5964

6065
var grouping = make([]sql.Expression, len(exp.Grouping))
@@ -69,9 +74,27 @@ func convertDates(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error) {
6974
}
7075

7176
result = plan.NewGroupBy(aggregate, grouping, exp.Child)
77+
case *plan.Project:
78+
var projections = make([]sql.Expression, len(exp.Projections))
79+
for i, e := range exp.Projections {
80+
expr, err := e.TransformUp(func(e sql.Expression) (sql.Expression, error) {
81+
return addDateConvert(e, exp, replacements, nodeReplacements, expressions, true)
82+
})
83+
if err != nil {
84+
return nil, err
85+
}
86+
87+
projections[i] = expr
88+
89+
if _, ok := expr.(*expression.Alias); !ok && expr.String() != e.String() {
90+
nodeReplacements[tableCol{"", e.String()}] = expr.String()
91+
}
92+
}
93+
94+
result = plan.NewProject(projections, exp.Child)
7295
default:
7396
result, err = exp.TransformExpressions(func(e sql.Expression) (sql.Expression, error) {
74-
return addDateConvert(e, n, replacements, nodeReplacements, expressions, true)
97+
return addDateConvert(e, n, replacements, nodeReplacements, expressions, false)
7598
})
7699
}
77100

sql/analyzer/convert_dates_test.go

+34-1
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package analyzer
33
import (
44
"testing"
55

6-
"github.com/stretchr/testify/require"
76
"github.com/src-d/go-mysql-server/mem"
87
"github.com/src-d/go-mysql-server/sql"
98
"github.com/src-d/go-mysql-server/sql/expression"
109
"github.com/src-d/go-mysql-server/sql/expression/function"
1110
"github.com/src-d/go-mysql-server/sql/expression/function/aggregation"
1211
"github.com/src-d/go-mysql-server/sql/plan"
12+
"github.com/stretchr/testify/require"
1313
)
1414

1515
func TestConvertDates(t *testing.T) {
@@ -249,6 +249,39 @@ func TestConvertDatesGroupBy(t *testing.T) {
249249
require.Equal(t, expected, result)
250250
}
251251

252+
func TestConvertDatesFieldReference(t *testing.T) {
253+
table := plan.NewResolvedTable(mem.NewTable("t", nil))
254+
input := plan.NewFilter(
255+
expression.NewEquals(
256+
expression.NewGetField(0, sql.Int64, "DAYOFWEEK(foo)", false),
257+
expression.NewLiteral("2019-06-06 00:00:00", sql.Text),
258+
),
259+
plan.NewProject([]sql.Expression{
260+
function.NewDayOfWeek(
261+
expression.NewGetField(0, sql.Timestamp, "foo", false),
262+
),
263+
}, table),
264+
)
265+
expected := plan.NewFilter(
266+
expression.NewEquals(
267+
expression.NewGetField(0, sql.Int64, "DAYOFWEEK(convert(foo, datetime))", false),
268+
expression.NewLiteral("2019-06-06 00:00:00", sql.Text),
269+
),
270+
plan.NewProject([]sql.Expression{
271+
function.NewDayOfWeek(
272+
expression.NewConvert(
273+
expression.NewGetField(0, sql.Timestamp, "foo", false),
274+
expression.ConvertToDatetime,
275+
),
276+
),
277+
}, table),
278+
)
279+
280+
result, err := convertDates(sql.NewEmptyContext(), nil, input)
281+
require.NoError(t, err)
282+
require.Equal(t, expected, result)
283+
}
284+
252285
func newDateAdd(l, r sql.Expression) sql.Expression {
253286
e, _ := function.NewDateAdd(l, r)
254287
return e

0 commit comments

Comments
 (0)