Skip to content

Commit 59c9bc9

Browse files
committed
merge main
2 parents 2158694 + ffdc4a9 commit 59c9bc9

File tree

8 files changed

+104
-21
lines changed

8 files changed

+104
-21
lines changed

enginetest/queries/generated_columns.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ var GeneratedColumnTests = []ScriptTest{
6565
Query: "select * from t1 where b = 5 order by a",
6666
Expected: []sql.Row{{4, 5}},
6767
},
68+
{
69+
Query: "insert into t1 values (5, DEFAULT)",
70+
Expected: []sql.Row{{types.NewOkResult(1)}},
71+
},
72+
{
73+
Query: "select * from t1 where a = 5",
74+
Expected: []sql.Row{{5, 6}},
75+
},
6876
{
6977
Query: "update t1 set b = b + 1",
7078
ExpectedErr: sql.ErrGeneratedColumnValue,
@@ -75,15 +83,43 @@ var GeneratedColumnTests = []ScriptTest{
7583
},
7684
{
7785
Query: "select * from t1 order by a",
78-
Expected: []sql.Row{{2, 3}, {3, 4}, {4, 5}, {10, 11}},
86+
Expected: []sql.Row{{2, 3}, {3, 4}, {4, 5}, {5, 6}, {10, 11}},
7987
},
8088
{
8189
Query: "delete from t1 where b = 11",
8290
Expected: []sql.Row{{types.NewOkResult(1)}},
8391
},
8492
{
8593
Query: "select * from t1 order by a",
86-
Expected: []sql.Row{{2, 3}, {3, 4}, {4, 5}},
94+
Expected: []sql.Row{{2, 3}, {3, 4}, {4, 5}, {5, 6}},
95+
},
96+
},
97+
},
98+
{
99+
Name: "generated column with DEFAULT in VALUES clause (issue #9428)",
100+
SetUpScript: []string{
101+
"create table t (i int generated always as (1 + 1))",
102+
},
103+
Assertions: []ScriptTestAssertion{
104+
{
105+
Query: "insert into t values (default)",
106+
Expected: []sql.Row{{types.NewOkResult(1)}},
107+
},
108+
{
109+
Query: "select * from t",
110+
Expected: []sql.Row{{2}},
111+
},
112+
{
113+
Query: "insert into t values (default), (default)",
114+
Expected: []sql.Row{{types.NewOkResult(2)}},
115+
},
116+
{
117+
Query: "select * from t order by i",
118+
Expected: []sql.Row{{2}, {2}, {2}},
119+
},
120+
{
121+
Query: "insert into t values (5)",
122+
ExpectedErr: sql.ErrGeneratedColumnValue,
87123
},
88124
},
89125
},

enginetest/queries/integration_plans.go

Lines changed: 14 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

enginetest/queries/script_queries.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8728,6 +8728,27 @@ where
87288728
},
87298729
},
87308730
},
8731+
{
8732+
// https://github.com/dolthub/dolt/issues/9024
8733+
Name: "subqueries should coerce union types",
8734+
Dialect: "mysql",
8735+
SetUpScript: []string{
8736+
"create table enum_table (i int primary key, e enum('a','b') not null)",
8737+
"insert into enum_table values (1,'a'),(2,'b')",
8738+
"create table uv (u int primary key, v varchar(10))",
8739+
"insert into uv values (0, 'bug'),(1,'ant'),(3, null)",
8740+
},
8741+
Assertions: []ScriptTestAssertion{
8742+
{
8743+
Query: "select * from (select e from enum_table union select v from uv) sq",
8744+
Expected: []sql.Row{{"a"}, {"b"}, {"bug"}, {"ant"}, {nil}},
8745+
},
8746+
{
8747+
Query: "with a as (select e from enum_table union select v from uv) select * from a",
8748+
Expected: []sql.Row{{"a"}, {"b"}, {"bug"}, {"ant"}, {nil}},
8749+
},
8750+
},
8751+
},
87318752

87328753
// Enum tests
87338754
{

sql/planbuilder/dml.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,6 @@ func (b *Builder) buildInsert(inScope *scope, i *ast.Insert) (outScope *scope) {
7676
schema := rt.Schema()
7777
columns = make([]string, len(schema))
7878
for i, col := range schema {
79-
// Tables with any generated column must always supply a column list, so this is always an error
80-
if col.Generated != nil {
81-
b.handleErr(sql.ErrGeneratedColumnValue.New(col.Name, rt.Name()))
82-
}
8379
columns[i] = col.Name
8480
}
8581
}

sql/planbuilder/dml_validate.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,12 @@ func validGeneratedColumnValue(idx int, source sql.Node) bool {
165165
if _, ok := val.Unwrap().(*sql.ColumnDefaultValue); ok {
166166
return true
167167
}
168+
if _, ok := val.Unwrap().(*expression.DefaultColumn); ok {
169+
return true
170+
}
168171
return false
172+
case *expression.DefaultColumn: // handle unwrapped DefaultColumn
173+
return true
169174
default:
170175
return false
171176
}

sql/planbuilder/set_op.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/dolthub/go-mysql-server/sql/expression"
2525
"github.com/dolthub/go-mysql-server/sql/plan"
2626
"github.com/dolthub/go-mysql-server/sql/transform"
27+
"github.com/dolthub/go-mysql-server/sql/types"
2728
)
2829

2930
func hasRecursiveCte(node sql.Node) bool {
@@ -144,10 +145,28 @@ func (b *Builder) buildSetOp(inScope *scope, u *ast.SetOp) (outScope *scope) {
144145
tabId := b.tabId
145146
ret := plan.NewSetOp(setOpType, leftScope.node, rightScope.node, distinct, limit, offset, sortFields).WithId(tabId).WithColumns(cols)
146147
outScope = leftScope
148+
outScope.cols = b.mergeSetOpScopeColumns(leftScope.cols, rightScope.cols, tabId)
147149
outScope.node = b.mergeSetOpSchemas(ret.(*plan.SetOp))
148150
return
149151
}
150152

153+
func (b *Builder) mergeSetOpScopeColumns(left, right []scopeColumn, tabId sql.TableId) []scopeColumn {
154+
merged := make([]scopeColumn, len(left))
155+
for i := range left {
156+
merged[i] = scopeColumn{
157+
tableId: tabId,
158+
db: left[i].db,
159+
table: left[i].table,
160+
col: left[i].col,
161+
originalCol: left[i].originalCol,
162+
id: left[i].id,
163+
typ: types.GeneralizeTypes(left[i].typ, right[i].typ),
164+
nullable: left[i].nullable || right[i].nullable,
165+
}
166+
}
167+
return merged
168+
}
169+
151170
func (b *Builder) mergeSetOpSchemas(u *plan.SetOp) sql.Node {
152171
ls, rs := u.Left().Schema(), u.Right().Schema()
153172
if len(ls) != len(rs) {

sql/types/conversion.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package types
1616

1717
import (
1818
"fmt"
19+
"reflect"
1920
"strconv"
2021
"strings"
2122
"time"
@@ -635,7 +636,12 @@ func generalizeNumberTypes(a, b sql.Type) sql.Type {
635636
// GeneralizeTypes returns the more "general" of two types as defined by
636637
// https://dev.mysql.com/doc/refman/8.4/en/flow-control-functions.html
637638
// TODO: Create and handle "Illegal mix of collations" error
639+
// TODO: Handle extended types, like DoltgresType
638640
func GeneralizeTypes(a, b sql.Type) sql.Type {
641+
if reflect.DeepEqual(a, b) {
642+
return a
643+
}
644+
639645
if a == Null {
640646
return b
641647
}

sql/types/conversion_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ func TestGeneralizeTypes(t *testing.T) {
207207
{Time, Date, DatetimeMaxPrecision},
208208
{Date, Date, Date},
209209
{Date, Timestamp, DatetimeMaxPrecision},
210-
{Timestamp, Timestamp, TimestampMaxPrecision},
210+
{Timestamp, Timestamp, Timestamp},
211211
{Timestamp, TimestampMaxPrecision, TimestampMaxPrecision},
212212
{Timestamp, Datetime, DatetimeMaxPrecision},
213213
{Null, Int64, Int64},

0 commit comments

Comments
 (0)