Skip to content

Commit e311718

Browse files
committed
Fix for negative len
1 parent 13e21c7 commit e311718

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

enginetest/queries/queries.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5453,7 +5453,13 @@ SELECT * FROM cte WHERE d = 2;`,
54535453
{
54545454
Query: `SELECT INSERT("hello", 1, -1, "xyz")`,
54555455
Expected: []sql.Row{
5456-
{string("hello")},
5456+
{string("xyz")},
5457+
},
5458+
},
5459+
{
5460+
Query: `SELECT INSERT("hello", 3, -1, "xyz")`,
5461+
Expected: []sql.Row{
5462+
{string("hexyz")},
54575463
},
54585464
},
54595465
{

sql/expression/function/insert.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ func (i *Insert) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
148148
n := newStrVal.(string)
149149

150150
// MySQL uses 1-based indexing for position
151-
// Handle negative position or negative length
152-
if p < 1 || l < 0 {
151+
// Handle negative position - return original string
152+
if p < 1 {
153153
return s, nil
154154
}
155155

@@ -162,9 +162,15 @@ func (i *Insert) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
162162
}
163163

164164
// Calculate end index
165-
endIdx := startIdx + l
166-
if endIdx > int64(len(s)) {
165+
// For negative length, replace from position to end of string
166+
var endIdx int64
167+
if l < 0 {
167168
endIdx = int64(len(s))
169+
} else {
170+
endIdx = startIdx + l
171+
if endIdx > int64(len(s)) {
172+
endIdx = int64(len(s))
173+
}
168174
}
169175

170176
// Build the result string

sql/expression/function/insert_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func TestInsert(t *testing.T) {
4545
{"empty string", sql.NewRow("", 1, 2, "new"), "", false},
4646
{"position is 0", sql.NewRow("hello", 0, 2, "new"), "hello", false},
4747
{"position is negative", sql.NewRow("hello", -1, 2, "new"), "hello", false},
48-
{"negative length", sql.NewRow("hello", 1, -1, "new"), "hello", false},
48+
{"negative length", sql.NewRow("hello", 1, -1, "new"), "new", false},
4949
{"position beyond string length", sql.NewRow("hello", 10, 2, "new"), "hello", false},
5050
{"normal insertion", sql.NewRow("hello", 2, 2, "xyz"), "hxyzlo", false},
5151
{"insert at beginning", sql.NewRow("hello", 1, 2, "xyz"), "xyzllo", false},
@@ -54,6 +54,8 @@ func TestInsert(t *testing.T) {
5454
{"length exceeds string", sql.NewRow("hello", 3, 10, "world"), "heworld", false},
5555
{"empty replacement", sql.NewRow("hello", 2, 2, ""), "hlo", false},
5656
{"zero length", sql.NewRow("hello", 3, 0, "xyz"), "hexyzllo", false},
57+
{"negative length from middle", sql.NewRow("hello", 3, -1, "xyz"), "hexyz", false},
58+
{"negative length from beginning", sql.NewRow("hello", 1, -5, "xyz"), "xyz", false},
5759
}
5860

5961
for _, tt := range testCases {

0 commit comments

Comments
 (0)