>From Shahrzad Shirazi <[email protected]>: Shahrzad Shirazi has posted comments on this change by Shahrzad Shirazi. ( https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20268?usp=email )
Change subject: [NO ISSUE][COMP] Adding UPDATE statement. ...................................................................... Patch Set 42: (2 comments) File asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20268/comment/6cd1747d_e6ec523a?usp=email : PS42, Line 19: org.apache.asterix.lang.sqlpp.rewrites.v What we have now ChangeExpression (UPDATE users SET ...) ↓ SqlppChangeSeqToSelectExprVisitor → Creates generated variable (U:gen:1) → Transforms to: SELECT ELEMENT data-transform(...) FROM ... AS U:gen:1 ↓ VariableCheckAndRewriteVisitor → Resolves variables in the SELECT expression → Generated variable U:gen:1 is already in scope What we have if we change things back: ChangeExpression (UPDATE users SET ...) ↓ VariableCheckAndRewriteVisitor (FIRST) → Tries to resolve variables in ChangeExpression → Generated variables don't exist yet! → Variables that should reference generated vars fail to resolve ↓ SqlppChangeSeqToSelectExprVisitor → Creates generated variable (U:gen:1) → But VariableCheckAndRewriteVisitor already ran, so it won't process the new SELECT. For a nested update: Current flow: 1.SqlppChangeSeqToSelectExprVisitor recursively processes inner ChangeExpression 2.Creates U:gen:1 for inner UPDATE 3.Creates U:gen:2 for outer UPDATE 4.U:gen:1 is available as context variable for outer UPDATE 5.VariableCheckAndRewriteVisitor resolves all variables If VariableCheckAndRewriteVisitor runs first: 1.Tries to resolve variables in nested ChangeExpression 2.U:gen:1 doesn't exist yet 3.Variables referencing U:gen:1 fail to resolve Compilation errors File asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecursiveRemovalEvaluator.java: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20268/comment/177f1c35_85613610?usp=email : PS42, Line 78: if (argRightTag != ATypeTag.OBJECT || argLeftTag != ATypeTag.OBJECT) { : result.set(argPtrRight); : return; : } The difference between this evaluator and the DataTransformEvaluator is that this is created for removing fields, so it uses onlyIncludeLeftRecordFields=true which means it only processes fields that exist in the left (removal) record. Fields in the left record indicate which fields should be removed from the right (source) record. In contrast, DataTransformEvaluator uses onlyIncludeLeftRecordFields=false to merge/update fields from both records. We can use the same evaluator for both and just send the flag? -- To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20268?usp=email To unsubscribe, or for help writing mail filters, visit https://asterix-gerrit.ics.uci.edu/settings?usp=email Gerrit-MessageType: comment Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Change-Id: Ib2d531b7b172b75b9756c7cc9b15dc636641f827 Gerrit-Change-Number: 20268 Gerrit-PatchSet: 42 Gerrit-Owner: Shahrzad Shirazi <[email protected]> Gerrit-Reviewer: Ali Alsuliman <[email protected]> Gerrit-Reviewer: Anon. E. Moose #1000171 Gerrit-Reviewer: Jenkins <[email protected]> Gerrit-Comment-Date: Fri, 14 Nov 2025 19:57:39 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No
