Skip to content

Commit 4d67403

Browse files
authored
Fix TimestampFuncExpr and SetOp in stored procedures (#3319)
1 parent fb85009 commit 4d67403

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

enginetest/queries/procedure_queries.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2352,6 +2352,61 @@ end;
23522352
},
23532353
},
23542354
},
2355+
{
2356+
Name: "stored procedure with subquery set operations",
2357+
SetUpScript: []string{
2358+
`create procedure sub_intersect() select(select 1 intersect select 2);`,
2359+
`create procedure sub_except() select(select 1 except select 2);`,
2360+
`
2361+
CREATE PROCEDURE test()
2362+
WITH RECURSIVE
2363+
data (str) AS (SELECT "test"),
2364+
positions (pos, chr) AS (
2365+
SELECT
2366+
1,
2367+
LEFT(data.str,1)
2368+
FROM
2369+
data
2370+
UNION ALL
2371+
SELECT
2372+
pos + 1,
2373+
MID(data.str,pos+1,1)
2374+
FROM
2375+
positions
2376+
CROSS JOIN
2377+
data
2378+
WHERE
2379+
pos < LENGTH(data.str)
2380+
)
2381+
SELECT
2382+
pos, chr
2383+
FROM
2384+
positions;`,
2385+
},
2386+
Assertions: []ScriptTestAssertion{
2387+
{
2388+
Query: "call sub_intersect();",
2389+
Expected: []sql.Row{
2390+
{nil},
2391+
},
2392+
},
2393+
{
2394+
Query: "call sub_except();",
2395+
Expected: []sql.Row{
2396+
{1},
2397+
},
2398+
},
2399+
{
2400+
Query: "call test();",
2401+
Expected: []sql.Row{
2402+
{1, "t"},
2403+
{2, "e"},
2404+
{3, "s"},
2405+
{4, "t"},
2406+
},
2407+
},
2408+
},
2409+
},
23552410
}
23562411

23572412
var ProcedureCallTests = []ScriptTest{
@@ -2589,6 +2644,31 @@ var ProcedureCallTests = []ScriptTest{
25892644
},
25902645
},
25912646
},
2647+
{
2648+
Name: "Procedures with TimestampFuncExpr",
2649+
SetUpScript: []string{
2650+
`CREATE PROCEDURE after_2000(IN bday DATE) SELECT TIMESTAMPDIFF(YEAR, '2000-01-01', bday);`,
2651+
`CREATE PROCEDURE add_month(IN bday DATE) SELECT TIMESTAMPADD(MONTH, 1, bday);`,
2652+
},
2653+
Assertions: []ScriptTestAssertion{
2654+
{
2655+
Query: "CALL after_2000('2001-09-11')",
2656+
Expected: []sql.Row{{1}},
2657+
},
2658+
{
2659+
Query: "CALL after_2000('2025-01-01')",
2660+
Expected: []sql.Row{{25}},
2661+
},
2662+
{
2663+
Query: "CALL add_month('2001-09-11')",
2664+
Expected: []sql.Row{{"2001-10-11 00:00:00"}},
2665+
},
2666+
{
2667+
Query: "CALL add_month('2025-01-01')",
2668+
Expected: []sql.Row{{"2025-02-01 00:00:00"}},
2669+
},
2670+
},
2671+
},
25922672
{
25932673
// https://github.com/dolthub/dolt/pull/7947/
25942674
Name: "Call a procedure that needs subqueries resolved in an if condition",

sql/procedures/interpreter_logic.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,17 @@ func replaceVariablesInExpr(ctx *sql.Context, stack *InterpreterStack, expr ast.
146146
return nil, err
147147
}
148148
e.Subquery = newSubquery.(*ast.Subquery)
149+
case *ast.TimestampFuncExpr:
150+
newExpr1, err := replaceVariablesInExpr(ctx, stack, e.Expr1, asOf)
151+
if err != nil {
152+
return nil, err
153+
}
154+
newExpr2, err := replaceVariablesInExpr(ctx, stack, e.Expr2, asOf)
155+
if err != nil {
156+
return nil, err
157+
}
158+
e.Expr1 = newExpr1.(ast.Expr)
159+
e.Expr2 = newExpr2.(ast.Expr)
149160
case *ast.FuncExpr:
150161
for i := range e.Exprs {
151162
newExpr, err := replaceVariablesInExpr(ctx, stack, e.Exprs[i], asOf)
@@ -266,7 +277,7 @@ func replaceVariablesInExpr(ctx *sql.Context, stack *InterpreterStack, expr ast.
266277
if err != nil {
267278
return nil, err
268279
}
269-
e.Select = newExpr.(*ast.Select)
280+
e.Select = newExpr.(ast.SelectStatement)
270281
case *ast.SetOp:
271282
newLeftExpr, err := replaceVariablesInExpr(ctx, stack, e.Left, asOf)
272283
if err != nil {

0 commit comments

Comments
 (0)