michaelsembwever opened a new pull request, #24657:
URL: https://github.com/apache/datafusion/pull/24657

   
   
   ## Which issue does this PR close?
   
   https://github.com/apache/datafusion/issues/24656
   
   ## Rationale for this change
   
   See ticket.
   
   ## What changes are included in this PR?
   
   
   A `DELETE` or an `UPDATE` whose `WHERE` clause holds an `IN` or an `EXISTS` 
subquery changed every row of the target table, and reported the whole table as 
affected. The optimizer rewrites the subquery into a semi join, so the 
condition leaves the `Filter` nodes that `extract_dml_filters()` reads. The 
provider then received an empty filter list, which is the encoding for "no 
WHERE clause", and applied the statement to all rows.
   
   An always-false `WHERE` clause reached the provider the same way. The 
simplifier folds the predicate into an empty relation, so again no filter 
survived, and a `DELETE FROM t WHERE false` emptied the table.
   
   Add `classify_dml_input()`, which walks the input plan of a `DELETE` or an 
`UPDATE` before the provider hook runs:
   
   - an empty relation means that no row matches, so the statement reports a 
count of 0 and the hook is not called;
   - a join, a predicate on another table, or any other node that restricts or 
multiplies rows raises a "not implemented" error, and the hook is not called.
   
   The hook stays untouched in every rejected case, so a provider that writes 
to durable storage cannot lose rows.
   
   
   ## Are these changes tested?
   
   Only with the tests provided in this patch, which are based on the 
assumptions made in the ticket description.
   
   ## Are there any user-facing changes?
   
   ?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to