Skip to content

Commit

Permalink
Merge pull request #451 from tablelandnetwork/bcalza/remove-constraints
Browse files Browse the repository at this point in the history
remove some subquery and join constraints
  • Loading branch information
brunocalza authored Aug 16, 2024
2 parents d48d11d + 2adce4c commit a982c05
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 193 deletions.
35 changes: 0 additions & 35 deletions grammar.y
Original file line number Diff line number Diff line change
Expand Up @@ -1375,13 +1375,6 @@ insert_stmt:
}
}

for _, row := range $6 {
for _, expr := range row {
if containsSubquery(expr) {
yylex.(*Lexer).AddError(&ErrStatementContainsSubquery{StatementKind: "insert"})
}
}
}
$3.IsTarget = true
$$ = &Insert{Table: $3, Columns: $4, Rows: $6, Upsert: $7}
}
Expand All @@ -1394,21 +1387,6 @@ insert_stmt:
{
$3.IsTarget = true

err := $5.walkSubtree(func(node Node) (bool, error) {
if _, ok := node.(*Subquery); ok {
return true, &ErrStatementContainsSubquery{StatementKind: "insert+select"}
}

if _, ok := node.(*JoinTableExpr); ok {
return true, &ErrContainsJoinTableExpr{}
}

return false, nil
})
if err != nil {
yylex.(*Lexer).AddError(err)
}

if sel, ok := $5.(*Select); ok {
if sel.OrderBy == nil {
sel.OrderBy = OrderBy{&OrderingTerm{Expr: &Column{Name: Identifier("rowid")}, Direction: AscStr, Nulls: NullsNil}}
Expand Down Expand Up @@ -1481,10 +1459,6 @@ on_conflict_clause:
}
| ON CONFLICT conflict_target_opt DO UPDATE SET update_list where_opt
{
if $8 != nil && containsSubquery($8) {
yylex.(*Lexer).AddError(&ErrStatementContainsSubquery{StatementKind: "where"})
}

$$ = &OnConflictClause{
Target: $3,
DoUpdate: &OnConflictUpdate{
Expand Down Expand Up @@ -1515,9 +1489,6 @@ conflict_target_opt:
delete_stmt:
DELETE FROM table_name where_opt
{
if $4 != nil && containsSubquery($4) {
yylex.(*Lexer).AddError(&ErrStatementContainsSubquery{StatementKind: "delete"})
}
$3.IsTarget = true
$$ = &Delete{Table: $3, Where: $4}
}
Expand All @@ -1526,9 +1497,6 @@ delete_stmt:
update_stmt:
UPDATE table_name SET update_list where_opt
{
if $5 != nil && containsSubquery($5) {
yylex.(*Lexer).AddError(&ErrStatementContainsSubquery{StatementKind: "where"})
}
$2.IsTarget = true
$$ = &Update{Table: $2, Exprs: $4, Where: $5}
}
Expand All @@ -1548,9 +1516,6 @@ update_list:
common_update_list:
update_expression
{
if containsSubquery($1.Expr) {
yylex.(*Lexer).AddError(&ErrStatementContainsSubquery{StatementKind: "update"})
}
$$ = []*UpdateExpr{$1}
}
| common_update_list ',' update_expression
Expand Down
Binary file modified js/main.wasm
Binary file not shown.
88 changes: 6 additions & 82 deletions parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4772,99 +4772,39 @@ func TestLimits(t *testing.T) {
})
}

func TestDisallowSubqueriesOnStatements(t *testing.T) {
func TestAllowSubqueriesOnStatements(t *testing.T) {
t.Parallel()
t.Run("insert", func(t *testing.T) {
ast, err := Parse("insert into t (a) VALUES ((select 1 FROM t limit 1))")
require.Error(t, err)
require.Len(t, ast.Errors, 1)

var e *ErrStatementContainsSubquery
require.ErrorAs(t, ast.Errors[0], &e)
if errors.As(ast.Errors[0], &e) {
require.Equal(t, "insert", e.StatementKind)
}
require.ErrorAs(t, err, &e)
require.NoError(t, err)
require.Equal(t, true, containsSubquery(ast))
})

t.Run("update update expr", func(t *testing.T) {
ast, err := Parse("update t set a = (select 1 FROM t limit 1)")
require.Error(t, err)
require.Len(t, ast.Errors, 1)

var e *ErrStatementContainsSubquery
require.ErrorAs(t, ast.Errors[0], &e)
if errors.As(ast.Errors[0], &e) {
require.Equal(t, "update", e.StatementKind)
}
require.ErrorAs(t, err, &e)
require.NoError(t, err)
require.Equal(t, true, containsSubquery(ast))
})

t.Run("update where", func(t *testing.T) {
ast, err := Parse("update foo set a=1 where a=(select a from bar limit 1) and b=1")
require.Error(t, err)
require.Len(t, ast.Errors, 1)

var e *ErrStatementContainsSubquery
require.ErrorAs(t, ast.Errors[0], &e)
if errors.As(ast.Errors[0], &e) {
require.Equal(t, "where", e.StatementKind)
}
require.ErrorAs(t, err, &e)
require.NoError(t, err)
require.Equal(t, true, containsSubquery(ast))
})

t.Run("delete", func(t *testing.T) {
ast, err := Parse("delete from t where a or (select 1 FROM t limit 1)")
require.Error(t, err)
require.Len(t, ast.Errors, 1)

var e *ErrStatementContainsSubquery
require.ErrorAs(t, ast.Errors[0], &e)
if errors.As(ast.Errors[0], &e) {
require.Equal(t, "delete", e.StatementKind)
}
require.ErrorAs(t, err, &e)
require.NoError(t, err)
require.Equal(t, true, containsSubquery(ast))
})

t.Run("upsert", func(t *testing.T) {
ast, err := Parse("INSERT INTO t (id, count) VALUES (1, 1) ON CONFLICT (id) DO UPDATE SET count = count + 1 WHERE (SELECT 1 FROM t2);") // nolint
require.Error(t, err)
require.Len(t, ast.Errors, 1)

var e *ErrStatementContainsSubquery
require.ErrorAs(t, ast.Errors[0], &e)
if errors.As(ast.Errors[0], &e) {
require.Equal(t, "where", e.StatementKind)
}
require.ErrorAs(t, err, &e)
require.NoError(t, err)
require.Equal(t, true, containsSubquery(ast))
})
}

func TestMultipleErrors(t *testing.T) {
t.Parallel()
ast, err := Parse("UPDATE t SET a = (select 1 from t2), b = unknown()")
require.Error(t, err)
require.Len(t, ast.Errors, 1)

var e1 *ErrStatementContainsSubquery
var e2 *ErrNoSuchFunction
require.ErrorAs(t, ast.Errors[0], &e1)
require.ErrorAs(t, ast.Errors[0], &e2)
if errors.As(ast.Errors[0], &e1) {
require.Equal(t, "update", e1.StatementKind)
}
if errors.As(ast.Errors[0], &e2) {
require.Equal(t, "unknown", e2.FunctionName)
}

require.ErrorAs(t, err, &e1)
}

func TestParallel(t *testing.T) {
parallelism := 200
numIters := 500
Expand Down Expand Up @@ -5465,22 +5405,6 @@ func TestInsertWithSelect(t *testing.T) {
return &err
}(),
},
{
name: "insert with select with join",
stmt: "INSERT INTO t_1_1 SELECT * FROM t_1_2, t_1_3",
expectedErr: func() **ErrContainsJoinTableExpr {
err := &ErrContainsJoinTableExpr{}
return &err
}(),
},
{
name: "insert with select with subselect",
stmt: "INSERT INTO t_1_1 SELECT * FROM (select * from t_1_2)",
expectedErr: func() **ErrStatementContainsSubquery {
err := &ErrStatementContainsSubquery{StatementKind: "insert+select"}
return &err
}(),
},
}

for _, tc := range tests {
Expand Down
Loading

0 comments on commit a982c05

Please sign in to comment.