Skip to content

Commit a77c705

Browse files
authored
Merge pull request #3209 from dolthub/angela/bitlength
Convert values to strings when evaluating `bit_length`
2 parents d93cc8b + 95d7b97 commit a77c705

File tree

4 files changed

+44
-32
lines changed

4 files changed

+44
-32
lines changed

enginetest/queries/function_queries.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -569,9 +569,26 @@ var FunctionQueryTests = []QueryTest{
569569
{
570570
Query: "SELECT BIT_LENGTH(i) from mytable order by i limit 1",
571571
Expected: []sql.Row{
572-
{64},
572+
{8},
573573
},
574574
},
575+
{
576+
// https://github.com/dolthub/dolt/issues/9818
577+
Query: "select bit_length(10)",
578+
Expected: []sql.Row{{16}},
579+
},
580+
{
581+
Query: "select bit_length(now())",
582+
Expected: []sql.Row{{152}},
583+
},
584+
{
585+
Query: "select bit_length(-10)",
586+
Expected: []sql.Row{{24}},
587+
},
588+
{
589+
Query: "select bit_length(true)",
590+
Expected: []sql.Row{{8}},
591+
},
575592
{
576593
Query: "select date_format(datetime_col, '%D') from datetime_table order by 1",
577594
Expected: []sql.Row{

enginetest/queries/script_queries.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9466,6 +9466,14 @@ where
94669466
{"hijkl", 5},
94679467
},
94689468
},
9469+
{
9470+
Query: "select e, bit_length(e) from t order by e;",
9471+
Expected: []sql.Row{
9472+
{"abc", 24},
9473+
{"defg", 32},
9474+
{"hijkl", 40},
9475+
},
9476+
},
94699477
{
94709478
Query: "select e, concat(e, 'test') from t order by e;",
94719479
Expected: []sql.Row{
@@ -10129,6 +10137,15 @@ where
1012910137
{"abc,defg,hijkl", 14},
1013010138
},
1013110139
},
10140+
{
10141+
Query: "select s, bit_length(s) from t order by s;",
10142+
Expected: []sql.Row{
10143+
{"abc", 24},
10144+
{"defg", 32},
10145+
{"abc,defg", 64},
10146+
{"abc,defg,hijkl", 112},
10147+
},
10148+
},
1013210149
{
1013310150
Query: "select s, concat(s, 'test') from t order by s;",
1013410151
Expected: []sql.Row{

sql/expression/function/string.go

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ func (h *Bin) convertToInt64(v interface{}) (int64, error) {
552552
}
553553
}
554554

555-
// Bitlength implements the sql function "bit_length" which returns the data length of the argument in bits
555+
// Bitlength implements the sql function "bit_length" which returns the length of a string in bits
556556
type Bitlength struct {
557557
*UnaryFunc
558558
}
@@ -590,24 +590,12 @@ func (h *Bitlength) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
590590
return nil, nil
591591
}
592592

593-
switch val := arg.(type) {
594-
case uint8, int8, bool:
595-
return 8, nil
596-
case uint16, int16:
597-
return 16, nil
598-
case int, uint, uint32, int32, float32:
599-
return 32, nil
600-
case uint64, int64, float64:
601-
return 64, nil
602-
case string:
603-
return 8 * len([]byte(val)), nil
604-
case []byte:
605-
return 8 * len(val), nil
606-
case time.Time:
607-
return 128, nil
593+
content, _, err := types.ConvertToCollatedString(ctx, arg, h.Child.Type())
594+
if err != nil {
595+
return nil, err
608596
}
609597

610-
return nil, sql.ErrInvalidArgumentDetails.New("bit_length", fmt.Sprint(arg))
598+
return 8 * len(content), nil
611599
}
612600

613601
// WithChildren implements the sql.Expression interface

sql/expression/function/string_test.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -143,24 +143,14 @@ func TestBinFunc(t *testing.T) {
143143
}
144144

145145
func TestBitLength(t *testing.T) {
146-
f := sql.Function1{Name: "bin", Fn: NewBitlength}
146+
f := sql.Function1{Name: "bit_length", Fn: NewBitlength}
147147
tf := NewTestFactory(f.Fn)
148148
tf.AddSucceeding(nil, nil)
149149
tf.AddSucceeding(32, "test")
150150
tf.AddSucceeding(8, true)
151-
tf.AddSucceeding(8, int8(0))
152-
tf.AddSucceeding(8, uint8(0))
153-
tf.AddSucceeding(16, int16(0))
154-
tf.AddSucceeding(16, uint16(0))
155-
tf.AddSucceeding(32, uint32(0))
156-
tf.AddSucceeding(32, int32(0))
157-
tf.AddSucceeding(32, uint(0))
158-
tf.AddSucceeding(32, 0)
159-
tf.AddSucceeding(64, uint64(0))
160-
tf.AddSucceeding(64, int64(0))
161-
tf.AddSucceeding(64, float64(0))
162-
tf.AddSucceeding(32, float32(0))
163-
tf.AddSucceeding(128, time.Now())
151+
tf.AddSucceeding(8, 0)
152+
tf.AddSucceeding(16, 10)
153+
tf.AddSucceeding(24, -10)
164154
tf.Test(t, nil, nil)
165155
}
166156

0 commit comments

Comments
 (0)