Skip to content

Commit 09029db

Browse files
author
James Cor
committed
asdf
1 parent 16c3a6a commit 09029db

File tree

9 files changed

+242
-188
lines changed

9 files changed

+242
-188
lines changed

enginetest/memory_engine_test.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,17 @@ func TestSingleScript(t *testing.T) {
203203
//t.Skip()
204204
var scripts = []queries.ScriptTest{
205205
{
206-
Name: "test",
207-
SetUpScript: []string{},
206+
Name: "asdfasdfasdf",
207+
SetUpScript: []string{
208+
"create table parent (e enum('a', 'b', 'c') primary key);",
209+
"insert into parent values (1), (2);",
210+
"create table child1 (e enum('x', 'y', 'z'), foreign key (e) references parent (e));",
211+
},
208212
Assertions: []queries.ScriptTestAssertion{
209213
{
210-
Query: "select bit_count('2.99a');",
214+
Query: "insert into child1 values (1), (2);",
211215
Expected: []sql.Row{
212-
{-3},
216+
{types.NewOkResult(2)},
213217
},
214218
},
215219
},

sql/expression/comparison.go

Lines changed: 150 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ package expression
1616

1717
import (
1818
"fmt"
19-
19+
"github.com/dolthub/vitess/go/mysql"
2020
errors "gopkg.in/src-d/go-errors.v1"
2121

2222
"github.com/dolthub/go-mysql-server/sql"
@@ -172,135 +172,161 @@ func (c *comparison) evalLeftAndRight(ctx *sql.Context, row sql.Row) (interface{
172172
}
173173

174174
func (c *comparison) CastLeftAndRight(ctx *sql.Context, left, right interface{}) (interface{}, interface{}, sql.Type, error) {
175-
leftType := c.Left().Type()
176-
rightType := c.Right().Type()
177-
178-
leftIsEnumOrSet := types.IsEnum(leftType) || types.IsSet(leftType)
179-
rightIsEnumOrSet := types.IsEnum(rightType) || types.IsSet(rightType)
180-
// Only convert if same Enum or Set
181-
if leftIsEnumOrSet && rightIsEnumOrSet {
182-
if types.TypesEqual(leftType, rightType) {
183-
return left, right, leftType, nil
184-
}
185-
} else {
186-
// If right side is convertible to enum/set, convert. Otherwise, convert left side
187-
if leftIsEnumOrSet && (types.IsText(rightType) || types.IsNumber(rightType)) {
188-
if r, inRange, err := leftType.Convert(ctx, right); inRange && err == nil {
189-
return left, r, leftType, nil
190-
} else {
191-
l, _, err := types.TypeAwareConversion(ctx, left, leftType, rightType, false)
192-
if err != nil {
193-
return nil, nil, nil, err
194-
}
195-
return l, right, rightType, nil
196-
}
197-
}
198-
// If left side is convertible to enum/set, convert. Otherwise, convert right side
199-
if rightIsEnumOrSet && (types.IsText(leftType) || types.IsNumber(leftType)) {
200-
if l, inRange, err := rightType.Convert(ctx, left); inRange && err == nil {
201-
return l, right, rightType, nil
202-
} else {
203-
r, _, err := types.TypeAwareConversion(ctx, right, rightType, leftType, false)
204-
if err != nil {
205-
return nil, nil, nil, err
206-
}
207-
return left, r, leftType, nil
208-
}
209-
}
210-
}
211-
212-
if types.IsTimespan(leftType) || types.IsTimespan(rightType) {
213-
if l, err := types.Time.ConvertToTimespan(left); err == nil {
214-
if r, err := types.Time.ConvertToTimespan(right); err == nil {
215-
return l, r, types.Time, nil
216-
}
217-
}
218-
}
219-
220-
if types.IsTuple(leftType) && types.IsTuple(rightType) {
221-
return left, right, c.Left().Type(), nil
222-
}
223-
224-
if types.IsTime(leftType) || types.IsTime(rightType) {
225-
l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDatetime)
226-
if err != nil {
227-
return nil, nil, nil, err
228-
}
229-
230-
return l, r, types.DatetimeMaxPrecision, nil
231-
}
232-
233-
// Rely on types.JSON.Compare to handle JSON comparisons
234-
if types.IsJSON(leftType) || types.IsJSON(rightType) {
235-
return left, right, types.JSON, nil
236-
}
237-
238-
if types.IsBinaryType(leftType) || types.IsBinaryType(rightType) {
239-
l, r, err := convertLeftAndRight(ctx, left, right, ConvertToBinary)
240-
if err != nil {
241-
return nil, nil, nil, err
242-
}
243-
return l, r, types.LongBlob, nil
244-
}
245-
246-
if types.IsNumber(leftType) || types.IsNumber(rightType) {
247-
if types.IsDecimal(leftType) || types.IsDecimal(rightType) {
248-
//TODO: We need to set to the actual DECIMAL type
249-
l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDecimal)
250-
if err != nil {
251-
return nil, nil, nil, err
252-
}
253-
254-
if types.IsDecimal(leftType) {
255-
return l, r, leftType, nil
256-
} else {
257-
return l, r, rightType, nil
258-
}
259-
}
260-
261-
if types.IsFloat(leftType) || types.IsFloat(rightType) {
262-
l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDouble)
263-
if err != nil {
264-
return nil, nil, nil, err
265-
}
266-
267-
return l, r, types.Float64, nil
268-
}
269-
270-
if types.IsSigned(leftType) && types.IsSigned(rightType) {
271-
l, r, err := convertLeftAndRight(ctx, left, right, ConvertToSigned)
272-
if err != nil {
273-
return nil, nil, nil, err
274-
}
275-
276-
return l, r, types.Int64, nil
277-
}
278-
279-
if types.IsUnsigned(leftType) && types.IsUnsigned(rightType) {
280-
l, r, err := convertLeftAndRight(ctx, left, right, ConvertToUnsigned)
281-
if err != nil {
282-
return nil, nil, nil, err
283-
}
284-
285-
return l, r, types.Uint64, nil
286-
}
287-
288-
l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDouble)
289-
if err != nil {
290-
return nil, nil, nil, err
175+
//leftType := c.Left().Type()
176+
//rightType := c.Right().Type()
177+
//
178+
//leftIsEnumOrSet := types.IsEnum(leftType) || types.IsSet(leftType)
179+
//rightIsEnumOrSet := types.IsEnum(rightType) || types.IsSet(rightType)
180+
//// Only convert if same Enum or Set
181+
//if leftIsEnumOrSet && rightIsEnumOrSet {
182+
// if types.TypesEqual(leftType, rightType) {
183+
// return left, right, leftType, nil
184+
// }
185+
//} else {
186+
// // If right side is convertible to enum/set, convert. Otherwise, convert left side
187+
// if leftIsEnumOrSet && (types.IsText(rightType) || types.IsNumber(rightType)) {
188+
// if r, inRange, err := leftType.Convert(ctx, right); inRange && err == nil {
189+
// return left, r, leftType, nil
190+
// } else {
191+
// l, _, err := types.TypeAwareConversion(ctx, left, leftType, rightType, false)
192+
// if err != nil {
193+
// return nil, nil, nil, err
194+
// }
195+
// return l, right, rightType, nil
196+
// }
197+
// }
198+
// // If left side is convertible to enum/set, convert. Otherwise, convert right side
199+
// if rightIsEnumOrSet && (types.IsText(leftType) || types.IsNumber(leftType)) {
200+
// if l, inRange, err := rightType.Convert(ctx, left); inRange && err == nil {
201+
// return l, right, rightType, nil
202+
// } else {
203+
// r, _, err := types.TypeAwareConversion(ctx, right, rightType, leftType, false)
204+
// if err != nil {
205+
// return nil, nil, nil, err
206+
// }
207+
// return left, r, leftType, nil
208+
// }
209+
// }
210+
//}
211+
//
212+
//if types.IsTimespan(leftType) || types.IsTimespan(rightType) {
213+
// if l, err := types.Time.ConvertToTimespan(left); err == nil {
214+
// if r, err := types.Time.ConvertToTimespan(right); err == nil {
215+
// return l, r, types.Time, nil
216+
// }
217+
// }
218+
//}
219+
//
220+
//if types.IsTuple(leftType) && types.IsTuple(rightType) {
221+
// return left, right, c.Left().Type(), nil
222+
//}
223+
//
224+
//if types.IsTime(leftType) || types.IsTime(rightType) {
225+
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDatetime)
226+
// if err != nil {
227+
// return nil, nil, nil, err
228+
// }
229+
//
230+
// return l, r, types.DatetimeMaxPrecision, nil
231+
//}
232+
//
233+
//// Rely on types.JSON.Compare to handle JSON comparisons
234+
//if types.IsJSON(leftType) || types.IsJSON(rightType) {
235+
// return left, right, types.JSON, nil
236+
//}
237+
//
238+
//if types.IsBinaryType(leftType) || types.IsBinaryType(rightType) {
239+
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToBinary)
240+
// if err != nil {
241+
// return nil, nil, nil, err
242+
// }
243+
// return l, r, types.LongBlob, nil
244+
//}
245+
//
246+
//if types.IsNumber(leftType) || types.IsNumber(rightType) {
247+
// if types.IsDecimal(leftType) || types.IsDecimal(rightType) {
248+
// //TODO: We need to set to the actual DECIMAL type
249+
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDecimal)
250+
// if err != nil {
251+
// return nil, nil, nil, err
252+
// }
253+
//
254+
// if types.IsDecimal(leftType) {
255+
// return l, r, leftType, nil
256+
// } else {
257+
// return l, r, rightType, nil
258+
// }
259+
// }
260+
//
261+
// if types.IsFloat(leftType) || types.IsFloat(rightType) {
262+
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDouble)
263+
// if err != nil {
264+
// return nil, nil, nil, err
265+
// }
266+
//
267+
// return l, r, types.Float64, nil
268+
// }
269+
//
270+
// if types.IsSigned(leftType) && types.IsSigned(rightType) {
271+
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToSigned)
272+
// if err != nil {
273+
// return nil, nil, nil, err
274+
// }
275+
//
276+
// return l, r, types.Int64, nil
277+
// }
278+
//
279+
// if types.IsUnsigned(leftType) && types.IsUnsigned(rightType) {
280+
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToUnsigned)
281+
// if err != nil {
282+
// return nil, nil, nil, err
283+
// }
284+
//
285+
// return l, r, types.Uint64, nil
286+
// }
287+
//
288+
// l, r, err := convertLeftAndRight(ctx, left, right, ConvertToDouble)
289+
// if err != nil {
290+
// return nil, nil, nil, err
291+
// }
292+
//
293+
// return l, r, types.Float64, nil
294+
//}
295+
//
296+
//left, right, err := convertLeftAndRight(ctx, left, right, ConvertToChar)
297+
//if err != nil {
298+
// return nil, nil, nil, err
299+
//}
300+
//
301+
//return left, right, types.LongText, nil
302+
303+
lType := c.Left().Type()
304+
rType := c.Right().Type()
305+
compType := types.GetCompareType(lType, rType)
306+
307+
// Special case for JSON types
308+
if types.IsJSON(compType) {
309+
return left, right, compType, nil
310+
}
311+
312+
l, _, err := types.TypeAwareConversion(ctx, left, lType, compType, false)
313+
if err != nil {
314+
if sql.ErrTruncatedIncorrect.Is(err) {
315+
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
291316
}
292-
293-
return l, r, types.Float64, nil
317+
// TODO: ignore all other errors?
294318
}
295-
296-
left, right, err := convertLeftAndRight(ctx, left, right, ConvertToChar)
319+
r, _, err := types.TypeAwareConversion(ctx, right, rType, compType, false)
297320
if err != nil {
298-
return nil, nil, nil, err
321+
if sql.ErrTruncatedIncorrect.Is(err) {
322+
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
323+
}
324+
// TODO: ignore all other errors?
299325
}
300-
301-
return left, right, types.LongText, nil
326+
return l, r, compType, nil
302327
}
303328

329+
// TODO: delete if everything else works out
304330
func convertLeftAndRight(ctx *sql.Context, left, right interface{}, convertTo string) (interface{}, interface{}, error) {
305331
l, err := convertValue(ctx, left, convertTo, nil, 0, 0)
306332
if err != nil {

sql/expression/convert.go

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

1717
import (
1818
"fmt"
19+
"github.com/dolthub/vitess/go/mysql"
1920
"strings"
2021
"time"
2122

@@ -351,13 +352,19 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s
351352
dt := createConvertedDecimalType(typeLength, typeScale, false)
352353
d, _, err := dt.Convert(ctx, val)
353354
if err != nil {
354-
return dt.Zero(), nil
355+
if !sql.ErrTruncatedIncorrect.Is(err) {
356+
return dt.Zero(), nil
357+
}
358+
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
355359
}
356360
return d, nil
357361
case ConvertToFloat:
358362
d, _, err := types.Float32.Convert(ctx, val)
359363
if err != nil {
360-
return types.Float32.Zero(), nil
364+
if !sql.ErrTruncatedIncorrect.Is(err) {
365+
return types.Float32.Zero(), nil
366+
}
367+
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
361368
}
362369
return d, nil
363370
case ConvertToDouble, ConvertToReal:
@@ -366,7 +373,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s
366373
return d, nil
367374
}
368375
if sql.ErrTruncatedIncorrect.Is(err) {
369-
ctx.Warn(1265, "%s", err.Error())
376+
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
370377
return d, nil
371378
}
372379
return types.Float64.Zero(), nil
@@ -382,7 +389,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s
382389
return num, nil
383390
}
384391
if sql.ErrTruncatedIncorrect.Is(err) {
385-
ctx.Warn(1265, "%s", err.Error())
392+
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
386393
return num, nil
387394
}
388395
return types.Int64.Zero(), nil
@@ -398,7 +405,7 @@ func convertValue(ctx *sql.Context, val interface{}, castTo string, originType s
398405
return num, nil
399406
}
400407
if sql.ErrTruncatedIncorrect.Is(err) {
401-
ctx.Warn(1265, "%s", err.Error())
408+
ctx.Warn(mysql.ERTruncatedWrongValue, "%s", err.Error())
402409
return num, nil
403410
}
404411
num, _, err = types.Int64.Convert(ctx, val)

0 commit comments

Comments
 (0)