Commit c235b5f
[SPARK-22746][SQL] Avoid the generation of useless mutable states by SortMergeJoin
## What changes were proposed in this pull request?
This PR reduce the number of global mutable variables in generated code of `SortMergeJoin`.
Before this PR, global mutable variables are used to extend lifetime of variables in the nested loop. This can be achieved by declaring variable at the outer most loop level where the variables are used.
In the following example, `smj_value8`, `smj_value8`, and `smj_value9` are declared as local variable at lines 145-147 in `With this PR`.
This PR fixes potential assertion error by #19865. Without this PR, a global mutable variable is potentially passed to arguments in generated code of split function.
Without this PR
```
/* 010 */ int smj_value8;
/* 011 */ boolean smj_value8;
/* 012 */ int smj_value9;
..
/* 143 */ protected void processNext() throws java.io.IOException {
/* 144 */ while (findNextInnerJoinRows(smj_leftInput, smj_rightInput)) {
/* 145 */ boolean smj_loaded = false;
/* 146 */ smj_isNull6 = smj_leftRow.isNullAt(1);
/* 147 */ smj_value9 = smj_isNull6 ? -1 : (smj_leftRow.getInt(1));
/* 148 */ scala.collection.Iterator<UnsafeRow> smj_iterator = smj_matches.generateIterator();
/* 149 */ while (smj_iterator.hasNext()) {
/* 150 */ InternalRow smj_rightRow1 = (InternalRow) smj_iterator.next();
/* 151 */ boolean smj_isNull8 = smj_rightRow1.isNullAt(1);
/* 152 */ int smj_value11 = smj_isNull8 ? -1 : (smj_rightRow1.getInt(1));
/* 153 */
/* 154 */ boolean smj_value12 = (smj_isNull6 && smj_isNull8) ||
/* 155 */ (!smj_isNull6 && !smj_isNull8 && smj_value9 == smj_value11);
/* 156 */ if (false || !smj_value12) continue;
/* 157 */ if (!smj_loaded) {
/* 158 */ smj_loaded = true;
/* 159 */ smj_value8 = smj_leftRow.getInt(0);
/* 160 */ }
/* 161 */ int smj_value10 = smj_rightRow1.getInt(0);
/* 162 */ smj_numOutputRows.add(1);
/* 163 */
/* 164 */ smj_rowWriter.zeroOutNullBytes();
/* 165 */
/* 166 */ smj_rowWriter.write(0, smj_value8);
/* 167 */
/* 168 */ if (smj_isNull6) {
/* 169 */ smj_rowWriter.setNullAt(1);
/* 170 */ } else {
/* 171 */ smj_rowWriter.write(1, smj_value9);
/* 172 */ }
/* 173 */
/* 174 */ smj_rowWriter.write(2, smj_value10);
/* 175 */
/* 176 */ if (smj_isNull8) {
/* 177 */ smj_rowWriter.setNullAt(3);
/* 178 */ } else {
/* 179 */ smj_rowWriter.write(3, smj_value11);
/* 180 */ }
/* 181 */ append(smj_result.copy());
/* 182 */
/* 183 */ }
/* 184 */ if (shouldStop()) return;
/* 185 */ }
/* 186 */ }
```
With this PR
```
/* 143 */ protected void processNext() throws java.io.IOException {
/* 144 */ while (findNextInnerJoinRows(smj_leftInput, smj_rightInput)) {
/* 145 */ int smj_value8 = -1;
/* 146 */ boolean smj_isNull6 = false;
/* 147 */ int smj_value9 = -1;
/* 148 */ boolean smj_loaded = false;
/* 149 */ smj_isNull6 = smj_leftRow.isNullAt(1);
/* 150 */ smj_value9 = smj_isNull6 ? -1 : (smj_leftRow.getInt(1));
/* 151 */ scala.collection.Iterator<UnsafeRow> smj_iterator = smj_matches.generateIterator();
/* 152 */ while (smj_iterator.hasNext()) {
/* 153 */ InternalRow smj_rightRow1 = (InternalRow) smj_iterator.next();
/* 154 */ boolean smj_isNull8 = smj_rightRow1.isNullAt(1);
/* 155 */ int smj_value11 = smj_isNull8 ? -1 : (smj_rightRow1.getInt(1));
/* 156 */
/* 157 */ boolean smj_value12 = (smj_isNull6 && smj_isNull8) ||
/* 158 */ (!smj_isNull6 && !smj_isNull8 && smj_value9 == smj_value11);
/* 159 */ if (false || !smj_value12) continue;
/* 160 */ if (!smj_loaded) {
/* 161 */ smj_loaded = true;
/* 162 */ smj_value8 = smj_leftRow.getInt(0);
/* 163 */ }
/* 164 */ int smj_value10 = smj_rightRow1.getInt(0);
/* 165 */ smj_numOutputRows.add(1);
/* 166 */
/* 167 */ smj_rowWriter.zeroOutNullBytes();
/* 168 */
/* 169 */ smj_rowWriter.write(0, smj_value8);
/* 170 */
/* 171 */ if (smj_isNull6) {
/* 172 */ smj_rowWriter.setNullAt(1);
/* 173 */ } else {
/* 174 */ smj_rowWriter.write(1, smj_value9);
/* 175 */ }
/* 176 */
/* 177 */ smj_rowWriter.write(2, smj_value10);
/* 178 */
/* 179 */ if (smj_isNull8) {
/* 180 */ smj_rowWriter.setNullAt(3);
/* 181 */ } else {
/* 182 */ smj_rowWriter.write(3, smj_value11);
/* 183 */ }
/* 184 */ append(smj_result.copy());
/* 185 */
/* 186 */ }
/* 187 */ if (shouldStop()) return;
/* 188 */ }
/* 189 */ }
```
## How was this patch tested?
Existing test cases
Author: Kazuaki Ishizaki <ishizaki@jp.ibm.com>
Closes #19937 from kiszk/SPARK-22746.1 parent a04f2be commit c235b5f
1 file changed
Lines changed: 17 additions & 10 deletions
Lines changed: 17 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
507 | 507 | | |
508 | 508 | | |
509 | 509 | | |
510 | | - | |
| 510 | + | |
511 | 511 | | |
512 | 512 | | |
513 | 513 | | |
514 | 514 | | |
515 | 515 | | |
516 | | - | |
| 516 | + | |
517 | 517 | | |
518 | 518 | | |
519 | 519 | | |
520 | 520 | | |
521 | | - | |
522 | | - | |
| 521 | + | |
| 522 | + | |
523 | 523 | | |
524 | 524 | | |
525 | | - | |
526 | 525 | | |
527 | 526 | | |
528 | 527 | | |
529 | | - | |
| 528 | + | |
530 | 529 | | |
531 | | - | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
532 | 536 | | |
533 | | - | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
534 | 540 | | |
535 | | - | |
| 541 | + | |
536 | 542 | | |
537 | 543 | | |
538 | 544 | | |
| |||
580 | 586 | | |
581 | 587 | | |
582 | 588 | | |
583 | | - | |
| 589 | + | |
584 | 590 | | |
585 | 591 | | |
586 | 592 | | |
| |||
617 | 623 | | |
618 | 624 | | |
619 | 625 | | |
| 626 | + | |
620 | 627 | | |
621 | 628 | | |
622 | 629 | | |
| |||
0 commit comments