@@ -46,23 +46,38 @@ object GenerateOrdering extends CodeGenerator[Seq[SortOrder], Ordering[InternalR
4646 protected def create (ordering : Seq [SortOrder ]): Ordering [InternalRow ] = {
4747 val ctx = newCodeGenContext()
4848
49- val comparisons = ordering.zipWithIndex.map { case (order, i) =>
50- val evalA = order.child.gen(ctx)
51- val evalB = order.child.gen(ctx)
49+ val comparisons = ordering.map { order =>
50+ val eval = order.child.gen(ctx)
5251 val asc = order.direction == Ascending
52+ val isNullA = ctx.freshName(" isNullA" )
53+ val primitiveA = ctx.freshName(" primitiveA" )
54+ val isNullB = ctx.freshName(" isNullB" )
55+ val primitiveB = ctx.freshName(" primitiveB" )
5356 s """
5457 i = a;
55- ${evalA.code}
58+ boolean $isNullA;
59+ ${ctx.javaType(order.child.dataType)} $primitiveA;
60+ {
61+ ${eval.code}
62+ $isNullA = ${eval.isNull};
63+ $primitiveA = ${eval.primitive};
64+ }
5665 i = b;
57- ${evalB.code}
58- if ( ${evalA.isNull} && ${evalB.isNull}) {
66+ boolean $isNullB;
67+ ${ctx.javaType(order.child.dataType)} $primitiveB;
68+ {
69+ ${eval.code}
70+ $isNullB = ${eval.isNull};
71+ $primitiveB = ${eval.primitive};
72+ }
73+ if ( $isNullA && $isNullB) {
5974 // Nothing
60- } else if ( ${evalA.isNull} ) {
75+ } else if ( $isNullA ) {
6176 return ${if (order.direction == Ascending ) " -1" else " 1" };
62- } else if ( ${evalB.isNull} ) {
77+ } else if ( $isNullB ) {
6378 return ${if (order.direction == Ascending ) " 1" else " -1" };
6479 } else {
65- int comp = ${ctx.genComp(order.child.dataType, evalA.primitive, evalB.primitive )};
80+ int comp = ${ctx.genComp(order.child.dataType, primitiveA, primitiveB )};
6681 if (comp != 0) {
6782 return ${if (asc) " comp" else " -comp" };
6883 }
0 commit comments