diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java index a3565c4..352a06c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/VectorizationContext.java @@ -115,6 +115,7 @@ import org.apache.hadoop.hive.ql.udf.UDFOPNegative; import org.apache.hadoop.hive.ql.udf.UDFOPPlus; import org.apache.hadoop.hive.ql.udf.UDFOPPositive; +import org.apache.hadoop.hive.ql.udf.UDFPosMod; import org.apache.hadoop.hive.ql.udf.UDFPower; import org.apache.hadoop.hive.ql.udf.UDFRegExp; import org.apache.hadoop.hive.ql.udf.UDFRTrim; @@ -737,11 +738,45 @@ private VectorExpression getVectorExpression(GenericUDFBridge udf, return getCastToDoubleExpression(childExpr); } else if (cl.equals(UDFToString.class)) { return getCastToString(childExpr); + } else if (cl.equals(UDFPosMod.class)) { + return getPosModExpression(childExpr); } throw new HiveException("Udf: "+udf.getClass().getSimpleName()+", is not supported"); } + private VectorExpression getPosModExpression(List childExpr) + throws HiveException { + String inputType = childExpr.get(0).getTypeString(); + + if (isIntFamily(inputType)) { + // Try to get the second argument (the modulo divisor) + long divisor = getLongScalar(childExpr.get(1)); + + // Use the standard logic for a unary function to handle the first argument. + VectorExpression e = getUnaryFunctionExpression("PosMod", "Long", childExpr, + CUSTOM_EXPR_PACKAGE); + + // Set second argument for this special case + ((ISetLongArg) e).setArg(divisor); + return e; + } else if (isFloatFamily(inputType)) { + + // Try to get the second argument (the modulo divisor) + double divisor = getDoubleScalar(childExpr.get(1)); + + // Use the standard logic for a unary function to handle the first argument. + VectorExpression e = getUnaryFunctionExpression("PosMod", "Double", childExpr, + CUSTOM_EXPR_PACKAGE); + + // Set second argument for this special case + ((ISetDoubleArg) e).setArg(divisor); + return e; + } + + throw new HiveException("Unhandled input type for PMOD(): " + inputType); + } + private VectorExpression getCastToTimestamp(List childExpr) throws HiveException { String inputType = childExpr.get(0).getTypeString(); @@ -905,16 +940,19 @@ private VectorExpression getLogWithBaseExpression(List childExpr) return getUnaryFunctionExpression("FuncLn", "Double", childExpr, GENERATED_EXPR_PACKAGE); } else if (childExpr.size() == 2) { - String argType = childExpr.get(0).getTypeString(); - // Try to get the second argument, typically a constant value (the base) - double base = getDoubleScalar(childExpr.get(1)); + // Get the type of the (normally variable) input expression + String argType = childExpr.get(1).getTypeString(); - // Use the standard logic for a unary function to handle the first argument. - VectorExpression e = getUnaryFunctionExpression("FuncLogWithBase", "Double", childExpr, + // Try to get the first argument, typically a constant value (the base) + double base = getDoubleScalar(childExpr.get(0)); + + // Use the standard logic for a unary function to handle the second argument. + VectorExpression e = getUnaryFunctionExpression("FuncLogWithBase", "Double", + childExpr.subList(1, 2), // pass the second argument as the first CUSTOM_EXPR_PACKAGE); - // set the second argument for this special case + // set the first argument (the base) for this special case ((ISetDoubleArg) e).setArg(base); return e; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/MathFuncLongToLong.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/MathFuncLongToLong.java new file mode 100644 index 0000000..4b1f908 --- /dev/null +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/MathFuncLongToLong.java @@ -0,0 +1,128 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.exec.vector.expressions; + +import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; + +/** + * Implement vectorized math function that takes a long (and optionally additional + * constant argument(s)) and returns long. Use this for PMOD() etc. + * + * Do NOT use this for simple math functions like sin/cos/exp etc. that just take + * a single argument. For those, modify the template ColumnUnaryFunc.txt + * and expand the template to generate needed classes. + */ +public abstract class MathFuncLongToLong extends VectorExpression { + private static final long serialVersionUID = 1L; + + private int colNum; + private int outputColumn; + + // Subclasses must override this with a function that implements the desired logic. + protected abstract long func(long d); + + public MathFuncLongToLong(int colNum, int outputColumn) { + this.colNum = colNum; + this.outputColumn = outputColumn; + } + + public MathFuncLongToLong() { + } + + @Override + public void evaluate(VectorizedRowBatch batch) { + + if (childExpressions != null) { + this.evaluateChildren(batch); + } + + LongColumnVector inputColVector = (LongColumnVector) batch.cols[colNum]; + LongColumnVector outputColVector = (LongColumnVector) batch.cols[outputColumn]; + int[] sel = batch.selected; + boolean[] inputIsNull = inputColVector.isNull; + boolean[] outputIsNull = outputColVector.isNull; + outputColVector.noNulls = inputColVector.noNulls; + int n = batch.size; + long[] vector = inputColVector.vector; + long[] outputVector = outputColVector.vector; + + // return immediately if batch is empty + if (n == 0) { + return; + } + + if (inputColVector.isRepeating) { + outputVector[0] = func(vector[0]); + + // Even if there are no nulls, we always copy over entry 0. Simplifies code. + outputIsNull[0] = inputIsNull[0]; + outputColVector.isRepeating = true; + } else if (inputColVector.noNulls) { + if (batch.selectedInUse) { + for(int j = 0; j != n; j++) { + int i = sel[j]; + outputVector[i] = func(vector[i]); + } + } else { + for(int i = 0; i != n; i++) { + outputVector[i] = func(vector[i]); + } + } + outputColVector.isRepeating = false; + } else /* there are nulls */ { + if (batch.selectedInUse) { + for(int j = 0; j != n; j++) { + int i = sel[j]; + outputVector[i] = func(vector[i]); + outputIsNull[i] = inputIsNull[i]; + } + } else { + for(int i = 0; i != n; i++) { + outputVector[i] = func(vector[i]); + } + System.arraycopy(inputIsNull, 0, outputIsNull, 0, n); + } + outputColVector.isRepeating = false; + } + } + + @Override + public int getOutputColumn() { + return outputColumn; + } + + public void setOutputColumn(int outputColumn) { + this.outputColumn = outputColumn; + } + + public int getColNum() { + return colNum; + } + + public void setColNum(int colNum) { + this.colNum = colNum; + } + + @Override + public String getOutputType() { + return "long"; + } +} diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/PosModDoubleToDouble.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/PosModDoubleToDouble.java new file mode 100644 index 0000000..1ac8078 --- /dev/null +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/PosModDoubleToDouble.java @@ -0,0 +1,53 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.exec.vector.expressions; + +public class PosModDoubleToDouble extends MathFuncDoubleToDouble + implements ISetDoubleArg { + private static final long serialVersionUID = 1L; + private double divisor; + + public PosModDoubleToDouble(int inputCol, int outputCol) { + super(inputCol, outputCol); + } + + public PosModDoubleToDouble() { + super(); + } + + @Override + protected double func(double v) { + + // return positive modulo + return ((v % divisor) + divisor) % divisor; + } + + @Override + public void setArg(double arg) { + this.divisor = arg; + } + + public void setDivisor(double v) { + this.divisor = v; + } + + public double getDivisor() { + return divisor; + } +} diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/PosModLongToLong.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/PosModLongToLong.java new file mode 100644 index 0000000..a9e0f7c --- /dev/null +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/PosModLongToLong.java @@ -0,0 +1,53 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.exec.vector.expressions; + +public class PosModLongToLong extends MathFuncLongToLong + implements ISetLongArg { + private static final long serialVersionUID = 1L; + private long divisor; + + public PosModLongToLong(int inputCol, int outputCol) { + super(inputCol, outputCol); + } + + public PosModLongToLong() { + super(); + } + + @Override + protected long func(long v) { + + // return positive modulo + return ((v % divisor) + divisor) % divisor; + } + + @Override + public void setArg(long arg) { + this.divisor = arg; + } + + public void setDivisor(long v) { + this.divisor = v; + } + + public long getDivisor() { + return divisor; + } +} diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java index a37ade2..257c026 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java @@ -96,6 +96,7 @@ import org.apache.hadoop.hive.ql.udf.UDFOPNegative; import org.apache.hadoop.hive.ql.udf.UDFOPPlus; import org.apache.hadoop.hive.ql.udf.UDFOPPositive; +import org.apache.hadoop.hive.ql.udf.UDFPosMod; import org.apache.hadoop.hive.ql.udf.UDFPower; import org.apache.hadoop.hive.ql.udf.UDFRTrim; import org.apache.hadoop.hive.ql.udf.UDFRadians; @@ -116,6 +117,7 @@ import org.apache.hadoop.hive.ql.udf.UDFToShort; import org.apache.hadoop.hive.ql.udf.UDFToString; import org.apache.hadoop.hive.ql.udf.UDFTrim; +import org.apache.hadoop.hive.ql.udf.UDFUnhex; import org.apache.hadoop.hive.ql.udf.UDFWeekOfYear; import org.apache.hadoop.hive.ql.udf.UDFYear; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; @@ -217,6 +219,7 @@ public Vectorizer() { supportedGenericUDFs.add(UDFLog10.class); supportedGenericUDFs.add(UDFLog.class); supportedGenericUDFs.add(UDFPower.class); + supportedGenericUDFs.add(UDFPosMod.class); supportedGenericUDFs.add(UDFRound.class); supportedGenericUDFs.add(UDFSqrt.class); supportedGenericUDFs.add(UDFSign.class); diff --git a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorMathFunctions.java b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorMathFunctions.java index 222d6b4..b8330d9 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorMathFunctions.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorMathFunctions.java @@ -428,6 +428,30 @@ public void testVectorLogBase() { } @Test + public void testVectorPosMod() { + + // test double->double version + VectorizedRowBatch b = getVectorizedRowBatchDoubleInDoubleOut(); + DoubleColumnVector inV = (DoubleColumnVector) b.cols[0]; + DoubleColumnVector resultV = (DoubleColumnVector) b.cols[1]; + b.cols[0].noNulls = true; + inV.vector[4] = -4.0; + VectorExpression expr = new PosModDoubleToDouble(0, 1); + ((ISetDoubleArg) expr).setArg(0.3d); // set base + expr.evaluate(b); + Assert.assertTrue(equalsWithinTolerance(((-4.0d % 0.3d) + 0.3d) % 0.3d, resultV.vector[4])); + + // test long->long version + b = getVectorizedRowBatchLongInLongOut(); + LongColumnVector resV2 = (LongColumnVector) b.cols[1]; + b.cols[0].noNulls = true; + expr = new PosModLongToLong(0, 1); + ((ISetLongArg) expr).setArg(3); + expr.evaluate(b); + Assert.assertEquals(((-2 % 3) + 3) % 3, resV2.vector[0]); + } + + @Test public void testVectorPower() { VectorizedRowBatch b = getVectorizedRowBatchDoubleInDoubleOut(); DoubleColumnVector resultV = (DoubleColumnVector) b.cols[1]; diff --git a/ql/src/test/queries/clientpositive/vectorized_casts.q b/ql/src/test/queries/clientpositive/vectorized_casts.q new file mode 100644 index 0000000..3f818b1 --- /dev/null +++ b/ql/src/test/queries/clientpositive/vectorized_casts.q @@ -0,0 +1,149 @@ +SET hive.vectorized.execution.enabled = true; + +-- Test type casting in vectorized mode to verify end-to-end functionality. + +explain +select +-- to boolean + cast (ctinyint as boolean) + ,cast (csmallint as boolean) + ,cast (cint as boolean) + ,cast (cbigint as boolean) + ,cast (cfloat as boolean) + ,cast (cdouble as boolean) + ,cast (cboolean1 as boolean) + ,cast (cbigint * 0 as boolean) + ,cast (ctimestamp1 as boolean) + ,cast (cstring1 as boolean) +-- to int family + ,cast (ctinyint as int) + ,cast (csmallint as int) + ,cast (cint as int) + ,cast (cbigint as int) + ,cast (cfloat as int) + ,cast (cdouble as int) + ,cast (cboolean1 as int) + ,cast (ctimestamp1 as int) + ,cast (cstring1 as int) + ,cast (substr(cstring1, 1, 1) as int) + ,cast (cfloat as tinyint) + ,cast (cfloat as smallint) + ,cast (cfloat as bigint) +-- to float family + ,cast (ctinyint as double) + ,cast (csmallint as double) + ,cast (cint as double) + ,cast (cbigint as double) + ,cast (cfloat as double) + ,cast (cdouble as double) + ,cast (cboolean1 as double) + ,cast (ctimestamp1 as double) + ,cast (cstring1 as double) + ,cast (substr(cstring1, 1, 1) as double) + ,cast (cint as float) + ,cast (cdouble as float) +-- to timestamp + ,cast (ctinyint as timestamp) + ,cast (csmallint as timestamp) + ,cast (cint as timestamp) + ,cast (cbigint as timestamp) + ,cast (cfloat as timestamp) + ,cast (cdouble as timestamp) + ,cast (cboolean1 as timestamp) + ,cast (cbigint * 0 as timestamp) + ,cast (ctimestamp1 as timestamp) + ,cast (cstring1 as timestamp) + ,cast (substr(cstring1, 1, 1) as timestamp) +-- to string + ,cast (ctinyint as string) + ,cast (csmallint as string) + ,cast (cint as string) + ,cast (cbigint as string) + ,cast (cfloat as string) + ,cast (cdouble as string) + ,cast (cboolean1 as string) + ,cast (cbigint * 0 as string) + ,cast (ctimestamp1 as string) + ,cast (cstring1 as string) +-- nested and expression arguments + ,cast (cast (cfloat as int) as float) + ,cast (cint * 2 as double) + ,cast (sin(cfloat) as string) + ,cast (cint as float) + cast(cboolean1 as double) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 250 = 0; + + +select +-- to boolean + cast (ctinyint as boolean) + ,cast (csmallint as boolean) + ,cast (cint as boolean) + ,cast (cbigint as boolean) + ,cast (cfloat as boolean) + ,cast (cdouble as boolean) + ,cast (cboolean1 as boolean) + ,cast (cbigint * 0 as boolean) + ,cast (ctimestamp1 as boolean) + ,cast (cstring1 as boolean) +-- to int family + ,cast (ctinyint as int) + ,cast (csmallint as int) + ,cast (cint as int) + ,cast (cbigint as int) + ,cast (cfloat as int) + ,cast (cdouble as int) + ,cast (cboolean1 as int) + ,cast (ctimestamp1 as int) + ,cast (cstring1 as int) + ,cast (substr(cstring1, 1, 1) as int) + ,cast (cfloat as tinyint) + ,cast (cfloat as smallint) + ,cast (cfloat as bigint) +-- to float family + ,cast (ctinyint as double) + ,cast (csmallint as double) + ,cast (cint as double) + ,cast (cbigint as double) + ,cast (cfloat as double) + ,cast (cdouble as double) + ,cast (cboolean1 as double) + ,cast (ctimestamp1 as double) + ,cast (cstring1 as double) + ,cast (substr(cstring1, 1, 1) as double) + ,cast (cint as float) + ,cast (cdouble as float) +-- to timestamp + ,cast (ctinyint as timestamp) + ,cast (csmallint as timestamp) + ,cast (cint as timestamp) + ,cast (cbigint as timestamp) + ,cast (cfloat as timestamp) + ,cast (cdouble as timestamp) + ,cast (cboolean1 as timestamp) + ,cast (cbigint * 0 as timestamp) + ,cast (ctimestamp1 as timestamp) + ,cast (cstring1 as timestamp) + ,cast (substr(cstring1, 1, 1) as timestamp) +-- to string + ,cast (ctinyint as string) + ,cast (csmallint as string) + ,cast (cint as string) + ,cast (cbigint as string) + ,cast (cfloat as string) + ,cast (cdouble as string) + ,cast (cboolean1 as string) + ,cast (cbigint * 0 as string) + ,cast (ctimestamp1 as string) + ,cast (cstring1 as string) +-- nested and expression arguments + ,cast (cast (cfloat as int) as float) + ,cast (cint * 2 as double) + ,cast (sin(cfloat) as string) + ,cast (cint as float) + cast(cboolean1 as double) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 250 = 0; + + \ No newline at end of file diff --git a/ql/src/test/queries/clientpositive/vectorized_math_funcs.q b/ql/src/test/queries/clientpositive/vectorized_math_funcs.q new file mode 100644 index 0000000..3b40fd4 --- /dev/null +++ b/ql/src/test/queries/clientpositive/vectorized_math_funcs.q @@ -0,0 +1,103 @@ +SET hive.vectorized.execution.enabled = true; + +-- Test math functions in vectorized mode to verify they run correctly end-to-end. + +explain +select + cdouble + ,Round(cdouble, 2) + ,Floor(cdouble) + ,Ceil(cdouble) + ,Rand() + ,Rand(98007) + ,Exp(ln(cdouble)) + ,Ln(cdouble) + ,Ln(cfloat) + ,Log10(cdouble) + -- Use log2 as a representative function to test all input types. + ,Log2(cdouble) + ,Log2(cfloat) + ,Log2(cbigint) + ,Log2(cint) + ,Log2(csmallint) + ,Log2(ctinyint) + ,Log(2.0, cdouble) + ,Pow(log2(cdouble), 2.0) + ,Power(log2(cdouble), 2.0) + ,Sqrt(cdouble) + ,Sqrt(cbigint) + ,Bin(cbigint) + ,Hex(cdouble) + ,Conv(cbigint, 10, 16) + ,Abs(cdouble) + ,Abs(ctinyint) + ,Pmod(cint, 3) + ,Sin(cdouble) + ,Asin(cdouble) + ,Cos(cdouble) + ,ACos(cdouble) + ,Atan(cdouble) + ,Degrees(cdouble) + ,Radians(cdouble) + ,Positive(cdouble) + ,Positive(cbigint) + ,Negative(cdouble) + ,Sign(cdouble) + ,Sign(cbigint) + -- Test nesting + ,cos(-sin(log(cdouble)) + 3.14159) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 500 = 0 +-- test use of a math function in the WHERE clause +and sin(cfloat) >= -1.0; + +select + cdouble + ,Round(cdouble, 2) + ,Floor(cdouble) + ,Ceil(cdouble) + -- Omit rand() from runtime test because it's nondeterministic. + -- ,Rand() + ,Rand(98007) + ,Exp(ln(cdouble)) + ,Ln(cdouble) + ,Ln(cfloat) + ,Log10(cdouble) + -- Use log2 as a representative function to test all input types. + ,Log2(cdouble) + ,Log2(cfloat) + ,Log2(cbigint) + ,Log2(cint) + ,Log2(csmallint) + ,Log2(ctinyint) + ,Log(2.0, cdouble) + ,Pow(log2(cdouble), 2.0) + ,Power(log2(cdouble), 2.0) + ,Sqrt(cdouble) + ,Sqrt(cbigint) + ,Bin(cbigint) + ,Hex(cdouble) + ,Conv(cbigint, 10, 16) + ,Abs(cdouble) + ,Abs(ctinyint) + ,Pmod(cint, 3) + ,Sin(cdouble) + ,Asin(cdouble) + ,Cos(cdouble) + ,ACos(cdouble) + ,Atan(cdouble) + ,Degrees(cdouble) + ,Radians(cdouble) + ,Positive(cdouble) + ,Positive(cbigint) + ,Negative(cdouble) + ,Sign(cdouble) + ,Sign(cbigint) + -- Test nesting + ,cos(-sin(log(cdouble)) + 3.14159) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 500 = 0 +-- test use of a math function in the WHERE clause +and sin(cfloat) >= -1.0; diff --git a/ql/src/test/queries/clientpositive/vectorized_string_funcs.q b/ql/src/test/queries/clientpositive/vectorized_string_funcs.q new file mode 100644 index 0000000..96fe53d --- /dev/null +++ b/ql/src/test/queries/clientpositive/vectorized_string_funcs.q @@ -0,0 +1,46 @@ +SET hive.vectorized.execution.enabled = true; + +-- Test string functions in vectorized mode to verify end-to-end functionality. + +explain +select + substr(cstring1, 1, 2) + ,substr(cstring1, 2) + ,lower(cstring1) + ,upper(cstring1) + ,ucase(cstring1) + ,length(cstring1) + ,trim(cstring1) + ,ltrim(cstring1) + ,rtrim(cstring1) + ,concat(cstring1, cstring2) + ,concat('>', cstring1) + ,concat(cstring1, '<') + ,concat(substr(cstring1, 1, 2), substr(cstring2, 1, 2)) +from alltypesorc +-- Limit the number of rows of output to a reasonable amount. +where cbigint % 237 = 0 +-- Test function use in the WHERE clause. +and length(substr(cstring1, 1, 2)) <= 2 +and cstring1 like '%'; + +select + substr(cstring1, 1, 2) + ,substr(cstring1, 2) + ,lower(cstring1) + ,upper(cstring1) + ,ucase(cstring1) + ,length(cstring1) + ,trim(cstring1) + ,ltrim(cstring1) + ,rtrim(cstring1) + ,concat(cstring1, cstring2) + ,concat('>', cstring1) + ,concat(cstring1, '<') + ,concat(substr(cstring1, 1, 2), substr(cstring2, 1, 2)) +from alltypesorc +-- Limit the number of rows of output to a reasonable amount. +where cbigint % 237 = 0 +-- Test function use in the WHERE clause. +and length(substr(cstring1, 1, 2)) <= 2 +and cstring1 like '%'; diff --git a/ql/src/test/results/clientpositive/vectorized_casts.q.out b/ql/src/test/results/clientpositive/vectorized_casts.q.out new file mode 100644 index 0000000..a61ccac --- /dev/null +++ b/ql/src/test/results/clientpositive/vectorized_casts.q.out @@ -0,0 +1,470 @@ +PREHOOK: query: -- Test type casting in vectorized mode to verify end-to-end functionality. +explain +select +-- to boolean + cast (ctinyint as boolean) + ,cast (csmallint as boolean) + ,cast (cint as boolean) + ,cast (cbigint as boolean) + ,cast (cfloat as boolean) + ,cast (cdouble as boolean) + ,cast (cboolean1 as boolean) + ,cast (cbigint * 0 as boolean) + ,cast (ctimestamp1 as boolean) + ,cast (cstring1 as boolean) +-- to int family + ,cast (ctinyint as int) + ,cast (csmallint as int) + ,cast (cint as int) + ,cast (cbigint as int) + ,cast (cfloat as int) + ,cast (cdouble as int) + ,cast (cboolean1 as int) + ,cast (ctimestamp1 as int) + ,cast (cstring1 as int) + ,cast (substr(cstring1, 1, 1) as int) + ,cast (cfloat as tinyint) + ,cast (cfloat as smallint) + ,cast (cfloat as bigint) +-- to float family + ,cast (ctinyint as double) + ,cast (csmallint as double) + ,cast (cint as double) + ,cast (cbigint as double) + ,cast (cfloat as double) + ,cast (cdouble as double) + ,cast (cboolean1 as double) + ,cast (ctimestamp1 as double) + ,cast (cstring1 as double) + ,cast (substr(cstring1, 1, 1) as double) + ,cast (cint as float) + ,cast (cdouble as float) +-- to timestamp + ,cast (ctinyint as timestamp) + ,cast (csmallint as timestamp) + ,cast (cint as timestamp) + ,cast (cbigint as timestamp) + ,cast (cfloat as timestamp) + ,cast (cdouble as timestamp) + ,cast (cboolean1 as timestamp) + ,cast (cbigint * 0 as timestamp) + ,cast (ctimestamp1 as timestamp) + ,cast (cstring1 as timestamp) + ,cast (substr(cstring1, 1, 1) as timestamp) +-- to string + ,cast (ctinyint as string) + ,cast (csmallint as string) + ,cast (cint as string) + ,cast (cbigint as string) + ,cast (cfloat as string) + ,cast (cdouble as string) + ,cast (cboolean1 as string) + ,cast (cbigint * 0 as string) + ,cast (ctimestamp1 as string) + ,cast (cstring1 as string) +-- nested and expression arguments + ,cast (cast (cfloat as int) as float) + ,cast (cint * 2 as double) + ,cast (sin(cfloat) as string) + ,cast (cint as float) + cast(cboolean1 as double) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 250 = 0 +PREHOOK: type: QUERY +POSTHOOK: query: -- Test type casting in vectorized mode to verify end-to-end functionality. +explain +select +-- to boolean + cast (ctinyint as boolean) + ,cast (csmallint as boolean) + ,cast (cint as boolean) + ,cast (cbigint as boolean) + ,cast (cfloat as boolean) + ,cast (cdouble as boolean) + ,cast (cboolean1 as boolean) + ,cast (cbigint * 0 as boolean) + ,cast (ctimestamp1 as boolean) + ,cast (cstring1 as boolean) +-- to int family + ,cast (ctinyint as int) + ,cast (csmallint as int) + ,cast (cint as int) + ,cast (cbigint as int) + ,cast (cfloat as int) + ,cast (cdouble as int) + ,cast (cboolean1 as int) + ,cast (ctimestamp1 as int) + ,cast (cstring1 as int) + ,cast (substr(cstring1, 1, 1) as int) + ,cast (cfloat as tinyint) + ,cast (cfloat as smallint) + ,cast (cfloat as bigint) +-- to float family + ,cast (ctinyint as double) + ,cast (csmallint as double) + ,cast (cint as double) + ,cast (cbigint as double) + ,cast (cfloat as double) + ,cast (cdouble as double) + ,cast (cboolean1 as double) + ,cast (ctimestamp1 as double) + ,cast (cstring1 as double) + ,cast (substr(cstring1, 1, 1) as double) + ,cast (cint as float) + ,cast (cdouble as float) +-- to timestamp + ,cast (ctinyint as timestamp) + ,cast (csmallint as timestamp) + ,cast (cint as timestamp) + ,cast (cbigint as timestamp) + ,cast (cfloat as timestamp) + ,cast (cdouble as timestamp) + ,cast (cboolean1 as timestamp) + ,cast (cbigint * 0 as timestamp) + ,cast (ctimestamp1 as timestamp) + ,cast (cstring1 as timestamp) + ,cast (substr(cstring1, 1, 1) as timestamp) +-- to string + ,cast (ctinyint as string) + ,cast (csmallint as string) + ,cast (cint as string) + ,cast (cbigint as string) + ,cast (cfloat as string) + ,cast (cdouble as string) + ,cast (cboolean1 as string) + ,cast (cbigint * 0 as string) + ,cast (ctimestamp1 as string) + ,cast (cstring1 as string) +-- nested and expression arguments + ,cast (cast (cfloat as int) as float) + ,cast (cint * 2 as double) + ,cast (sin(cfloat) as string) + ,cast (cint as float) + cast(cboolean1 as double) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 250 = 0 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME alltypesorc))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL ctinyint))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL csmallint))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL cint))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL cboolean1))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (* (TOK_TABLE_OR_COL cbigint) 0))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL ctimestamp1))) (TOK_SELEXPR (TOK_FUNCTION TOK_BOOLEAN (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL ctinyint))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL csmallint))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL cint))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL cboolean1))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL ctimestamp1))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION TOK_INT (TOK_FUNCTION substr (TOK_TABLE_OR_COL cstring1) 1 1))) (TOK_SELEXPR (TOK_FUNCTION TOK_TINYINT (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION TOK_SMALLINT (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION TOK_BIGINT (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL ctinyint))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL csmallint))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL cint))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL cboolean1))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL ctimestamp1))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (TOK_FUNCTION substr (TOK_TABLE_OR_COL cstring1) 1 1))) (TOK_SELEXPR (TOK_FUNCTION TOK_FLOAT (TOK_TABLE_OR_COL cint))) (TOK_SELEXPR (TOK_FUNCTION TOK_FLOAT (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL ctinyint))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL csmallint))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL cint))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL cboolean1))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (* (TOK_TABLE_OR_COL cbigint) 0))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL ctimestamp1))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION TOK_TIMESTAMP (TOK_FUNCTION substr (TOK_TABLE_OR_COL cstring1) 1 1))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL ctinyint))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL csmallint))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL cint))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL cboolean1))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (* (TOK_TABLE_OR_COL cbigint) 0))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL ctimestamp1))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION TOK_FLOAT (TOK_FUNCTION TOK_INT (TOK_TABLE_OR_COL cfloat)))) (TOK_SELEXPR (TOK_FUNCTION TOK_DOUBLE (* (TOK_TABLE_OR_COL cint) 2))) (TOK_SELEXPR (TOK_FUNCTION TOK_STRING (TOK_FUNCTION sin (TOK_TABLE_OR_COL cfloat)))) (TOK_SELEXPR (+ (TOK_FUNCTION TOK_FLOAT (TOK_TABLE_OR_COL cint)) (TOK_FUNCTION TOK_DOUBLE (TOK_TABLE_OR_COL cboolean1))))) (TOK_WHERE (= (% (TOK_TABLE_OR_COL cbigint) 250) 0)))) +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + alltypesorc + TableScan + alias: alltypesorc + Filter Operator + predicate: + expr: ((cbigint % 250) = 0) + type: boolean + Vectorized execution: true + Select Operator + expressions: + expr: UDFToBoolean(ctinyint) + type: boolean + expr: UDFToBoolean(csmallint) + type: boolean + expr: UDFToBoolean(cint) + type: boolean + expr: UDFToBoolean(cbigint) + type: boolean + expr: UDFToBoolean(cfloat) + type: boolean + expr: UDFToBoolean(cdouble) + type: boolean + expr: cboolean1 + type: boolean + expr: UDFToBoolean((cbigint * 0)) + type: boolean + expr: UDFToBoolean(ctimestamp1) + type: boolean + expr: UDFToBoolean(cstring1) + type: boolean + expr: UDFToInteger(ctinyint) + type: int + expr: UDFToInteger(csmallint) + type: int + expr: cint + type: int + expr: UDFToInteger(cbigint) + type: int + expr: UDFToInteger(cfloat) + type: int + expr: UDFToInteger(cdouble) + type: int + expr: UDFToInteger(cboolean1) + type: int + expr: UDFToInteger(ctimestamp1) + type: int + expr: UDFToInteger(cstring1) + type: int + expr: UDFToInteger(substr(cstring1, 1, 1)) + type: int + expr: UDFToByte(cfloat) + type: tinyint + expr: UDFToShort(cfloat) + type: smallint + expr: UDFToLong(cfloat) + type: bigint + expr: UDFToDouble(ctinyint) + type: double + expr: UDFToDouble(csmallint) + type: double + expr: UDFToDouble(cint) + type: double + expr: UDFToDouble(cbigint) + type: double + expr: UDFToDouble(cfloat) + type: double + expr: cdouble + type: double + expr: UDFToDouble(cboolean1) + type: double + expr: UDFToDouble(ctimestamp1) + type: double + expr: UDFToDouble(cstring1) + type: double + expr: UDFToDouble(substr(cstring1, 1, 1)) + type: double + expr: UDFToFloat(cint) + type: float + expr: UDFToFloat(cdouble) + type: float + expr: CAST( ctinyint AS TIMESTAMP) + type: timestamp + expr: CAST( csmallint AS TIMESTAMP) + type: timestamp + expr: CAST( cint AS TIMESTAMP) + type: timestamp + expr: CAST( cbigint AS TIMESTAMP) + type: timestamp + expr: CAST( cfloat AS TIMESTAMP) + type: timestamp + expr: CAST( cdouble AS TIMESTAMP) + type: timestamp + expr: CAST( cboolean1 AS TIMESTAMP) + type: timestamp + expr: CAST( (cbigint * 0) AS TIMESTAMP) + type: timestamp + expr: ctimestamp1 + type: timestamp + expr: CAST( cstring1 AS TIMESTAMP) + type: timestamp + expr: CAST( substr(cstring1, 1, 1) AS TIMESTAMP) + type: timestamp + expr: UDFToString(ctinyint) + type: string + expr: UDFToString(csmallint) + type: string + expr: UDFToString(cint) + type: string + expr: UDFToString(cbigint) + type: string + expr: UDFToString(cfloat) + type: string + expr: UDFToString(cdouble) + type: string + expr: UDFToString(cboolean1) + type: string + expr: UDFToString((cbigint * 0)) + type: string + expr: UDFToString(ctimestamp1) + type: string + expr: cstring1 + type: string + expr: UDFToFloat(UDFToInteger(cfloat)) + type: float + expr: UDFToDouble((cint * 2)) + type: double + expr: UDFToString(sin(cfloat)) + type: string + expr: (UDFToFloat(cint) + UDFToDouble(cboolean1)) + type: double + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23, _col24, _col25, _col26, _col27, _col28, _col29, _col30, _col31, _col32, _col33, _col34, _col35, _col36, _col37, _col38, _col39, _col40, _col41, _col42, _col43, _col44, _col45, _col46, _col47, _col48, _col49, _col50, _col51, _col52, _col53, _col54, _col55, _col56, _col57, _col58, _col59 + Vectorized execution: true + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Vectorized execution: true + Stage: Stage-0 + Fetch Operator + limit: -1 +PREHOOK: query: select +-- to boolean + cast (ctinyint as boolean) + ,cast (csmallint as boolean) + ,cast (cint as boolean) + ,cast (cbigint as boolean) + ,cast (cfloat as boolean) + ,cast (cdouble as boolean) + ,cast (cboolean1 as boolean) + ,cast (cbigint * 0 as boolean) + ,cast (ctimestamp1 as boolean) + ,cast (cstring1 as boolean) +-- to int family + ,cast (ctinyint as int) + ,cast (csmallint as int) + ,cast (cint as int) + ,cast (cbigint as int) + ,cast (cfloat as int) + ,cast (cdouble as int) + ,cast (cboolean1 as int) + ,cast (ctimestamp1 as int) + ,cast (cstring1 as int) + ,cast (substr(cstring1, 1, 1) as int) + ,cast (cfloat as tinyint) + ,cast (cfloat as smallint) + ,cast (cfloat as bigint) +-- to float family + ,cast (ctinyint as double) + ,cast (csmallint as double) + ,cast (cint as double) + ,cast (cbigint as double) + ,cast (cfloat as double) + ,cast (cdouble as double) + ,cast (cboolean1 as double) + ,cast (ctimestamp1 as double) + ,cast (cstring1 as double) + ,cast (substr(cstring1, 1, 1) as double) + ,cast (cint as float) + ,cast (cdouble as float) +-- to timestamp + ,cast (ctinyint as timestamp) + ,cast (csmallint as timestamp) + ,cast (cint as timestamp) + ,cast (cbigint as timestamp) + ,cast (cfloat as timestamp) + ,cast (cdouble as timestamp) + ,cast (cboolean1 as timestamp) + ,cast (cbigint * 0 as timestamp) + ,cast (ctimestamp1 as timestamp) + ,cast (cstring1 as timestamp) + ,cast (substr(cstring1, 1, 1) as timestamp) +-- to string + ,cast (ctinyint as string) + ,cast (csmallint as string) + ,cast (cint as string) + ,cast (cbigint as string) + ,cast (cfloat as string) + ,cast (cdouble as string) + ,cast (cboolean1 as string) + ,cast (cbigint * 0 as string) + ,cast (ctimestamp1 as string) + ,cast (cstring1 as string) +-- nested and expression arguments + ,cast (cast (cfloat as int) as float) + ,cast (cint * 2 as double) + ,cast (sin(cfloat) as string) + ,cast (cint as float) + cast(cboolean1 as double) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 250 = 0 +PREHOOK: type: QUERY +PREHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +POSTHOOK: query: select +-- to boolean + cast (ctinyint as boolean) + ,cast (csmallint as boolean) + ,cast (cint as boolean) + ,cast (cbigint as boolean) + ,cast (cfloat as boolean) + ,cast (cdouble as boolean) + ,cast (cboolean1 as boolean) + ,cast (cbigint * 0 as boolean) + ,cast (ctimestamp1 as boolean) + ,cast (cstring1 as boolean) +-- to int family + ,cast (ctinyint as int) + ,cast (csmallint as int) + ,cast (cint as int) + ,cast (cbigint as int) + ,cast (cfloat as int) + ,cast (cdouble as int) + ,cast (cboolean1 as int) + ,cast (ctimestamp1 as int) + ,cast (cstring1 as int) + ,cast (substr(cstring1, 1, 1) as int) + ,cast (cfloat as tinyint) + ,cast (cfloat as smallint) + ,cast (cfloat as bigint) +-- to float family + ,cast (ctinyint as double) + ,cast (csmallint as double) + ,cast (cint as double) + ,cast (cbigint as double) + ,cast (cfloat as double) + ,cast (cdouble as double) + ,cast (cboolean1 as double) + ,cast (ctimestamp1 as double) + ,cast (cstring1 as double) + ,cast (substr(cstring1, 1, 1) as double) + ,cast (cint as float) + ,cast (cdouble as float) +-- to timestamp + ,cast (ctinyint as timestamp) + ,cast (csmallint as timestamp) + ,cast (cint as timestamp) + ,cast (cbigint as timestamp) + ,cast (cfloat as timestamp) + ,cast (cdouble as timestamp) + ,cast (cboolean1 as timestamp) + ,cast (cbigint * 0 as timestamp) + ,cast (ctimestamp1 as timestamp) + ,cast (cstring1 as timestamp) + ,cast (substr(cstring1, 1, 1) as timestamp) +-- to string + ,cast (ctinyint as string) + ,cast (csmallint as string) + ,cast (cint as string) + ,cast (cbigint as string) + ,cast (cfloat as string) + ,cast (cdouble as string) + ,cast (cboolean1 as string) + ,cast (cbigint * 0 as string) + ,cast (ctimestamp1 as string) + ,cast (cstring1 as string) +-- nested and expression arguments + ,cast (cast (cfloat as int) as float) + ,cast (cint * 2 as double) + ,cast (sin(cfloat) as string) + ,cast (cint as float) + cast(cboolean1 as double) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 250 = 0 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +true true NULL true true true NULL false true NULL -36 -200 NULL -2006216750 -36 -200 NULL -14 NULL NULL -36 -36 -36 -36.0 -200.0 NULL -2.00621675E9 -36.0 -200.0 NULL -14.252 NULL NULL NULL -200.0 1969-12-31 15:59:59.964 1969-12-31 15:59:59.8 NULL 1969-12-08 10:43:03.25 1969-12-31 15:59:24 1969-12-31 15:56:40 NULL 1969-12-31 16:00:00 1969-12-31 15:59:45.748 NULL NULL -36 -200 NULL -2006216750 -36.0 -200.0 NULL 0 1969-12-31 15:59:45.748 NULL -36.0 NULL 0.9917788534431158 NULL +true true NULL true true true NULL false true NULL -36 -200 NULL 1599879000 -36 -200 NULL -6 NULL NULL -36 -36 -36 -36.0 -200.0 NULL 1.599879E9 -36.0 -200.0 NULL -6.183 NULL NULL NULL -200.0 1969-12-31 15:59:59.964 1969-12-31 15:59:59.8 NULL 1970-01-19 04:24:39 1969-12-31 15:59:24 1969-12-31 15:56:40 NULL 1969-12-31 16:00:00 1969-12-31 15:59:53.817 NULL NULL -36 -200 NULL 1599879000 -36.0 -200.0 NULL 0 1969-12-31 15:59:53.817 NULL -36.0 NULL 0.9917788534431158 NULL +true true NULL true true true NULL false true NULL -30 -200 NULL 1429852250 -30 -200 NULL 12 NULL NULL -30 -30 -30 -30.0 -200.0 NULL 1.42985225E9 -30.0 -200.0 NULL 12.935 NULL NULL NULL -200.0 1969-12-31 15:59:59.97 1969-12-31 15:59:59.8 NULL 1970-01-17 05:10:52.25 1969-12-31 15:59:30 1969-12-31 15:56:40 NULL 1969-12-31 16:00:00 1969-12-31 16:00:12.935 NULL NULL -30 -200 NULL 1429852250 -30.0 -200.0 NULL 0 1969-12-31 16:00:12.935 NULL -30.0 NULL 0.9880316240928618 NULL +true NULL true true true NULL false false true true -51 NULL 773600971 1053923250 -51 NULL 0 8 NULL 2 -51 -51 -51 -51.0 NULL 7.73600971E8 1.05392325E9 -51.0 NULL 0.0 8.451 NULL 2.0 7.7360096E8 NULL 1969-12-31 15:59:59.949 NULL 1970-01-09 14:53:20.971 1970-01-12 20:45:23.25 1969-12-31 15:59:09 NULL 1969-12-31 16:00:00 1969-12-31 16:00:00 1969-12-31 16:00:08.451 NULL NULL -51 NULL 773600971 1053923250 -51.0 NULL FALSE 0 1969-12-31 16:00:08.451 2yK4Bx76O -51.0 1.547201942E9 -0.6702291758433747 7.73600971E8 +true NULL true true true NULL true false true true -51 NULL 747553882 -1930467250 -51 NULL 1 8 NULL NULL -51 -51 -51 -51.0 NULL 7.47553882E8 -1.93046725E9 -51.0 NULL 1.0 8.451 NULL NULL 7.4755386E8 NULL 1969-12-31 15:59:59.949 NULL 1970-01-09 07:39:13.882 1969-12-09 07:45:32.75 1969-12-31 15:59:09 NULL 1969-12-31 16:00:00.001 1969-12-31 16:00:00 1969-12-31 16:00:08.451 NULL NULL -51 NULL 747553882 -1930467250 -51.0 NULL TRUE 0 1969-12-31 16:00:08.451 q8M86Fx0r -51.0 1.495107764E9 -0.6702291758433747 7.47553883E8 +true true NULL true true true NULL false true NULL 20 15601 NULL -362433250 20 15601 NULL -14 NULL NULL 20 20 20 20.0 15601.0 NULL -3.6243325E8 20.0 15601.0 NULL -14.871 NULL NULL NULL 15601.0 1969-12-31 16:00:00.02 1969-12-31 16:00:15.601 NULL 1969-12-27 11:19:26.75 1969-12-31 16:00:20 1969-12-31 20:20:01 NULL 1969-12-31 16:00:00 1969-12-31 15:59:45.129 NULL NULL 20 15601 NULL -362433250 20.0 15601.0 NULL 0 1969-12-31 15:59:45.129 NULL 20.0 NULL 0.9129452507276277 NULL +true true NULL true true true NULL false true NULL -38 15601 NULL -1858689000 -38 15601 NULL -1 NULL NULL -38 -38 -38 -38.0 15601.0 NULL -1.858689E9 -38.0 15601.0 NULL -1.386 NULL NULL NULL 15601.0 1969-12-31 15:59:59.962 1969-12-31 16:00:15.601 NULL 1969-12-10 03:41:51 1969-12-31 15:59:22 1969-12-31 20:20:01 NULL 1969-12-31 16:00:00 1969-12-31 15:59:58.614 NULL NULL -38 15601 NULL -1858689000 -38.0 15601.0 NULL 0 1969-12-31 15:59:58.614 NULL -38.0 NULL -0.2963685787093853 NULL +true true NULL true true true NULL false true NULL -5 15601 NULL 612416000 -5 15601 NULL 4 NULL NULL -5 -5 -5 -5.0 15601.0 NULL 6.12416E8 -5.0 15601.0 NULL 4.679 NULL NULL NULL 15601.0 1969-12-31 15:59:59.995 1969-12-31 16:00:15.601 NULL 1970-01-07 18:06:56 1969-12-31 15:59:55 1969-12-31 20:20:01 NULL 1969-12-31 16:00:00 1969-12-31 16:00:04.679 NULL NULL -5 15601 NULL 612416000 -5.0 15601.0 NULL 0 1969-12-31 16:00:04.679 NULL -5.0 NULL 0.9589242746631385 NULL +true true NULL true true true NULL false true NULL 48 15601 NULL -795361000 48 15601 NULL -9 NULL NULL 48 48 48 48.0 15601.0 NULL -7.95361E8 48.0 15601.0 NULL -9.765 NULL NULL NULL 15601.0 1969-12-31 16:00:00.048 1969-12-31 16:00:15.601 NULL 1969-12-22 11:03:59 1969-12-31 16:00:48 1969-12-31 20:20:01 NULL 1969-12-31 16:00:00 1969-12-31 15:59:50.235 NULL NULL 48 15601 NULL -795361000 48.0 15601.0 NULL 0 1969-12-31 15:59:50.235 NULL 48.0 NULL -0.7682546613236668 NULL +true NULL true true true NULL false false true true 8 NULL -661621138 -931392750 8 NULL 0 15 NULL NULL 8 8 8 8.0 NULL -6.61621138E8 -9.3139275E8 8.0 NULL 0.0 15.892 NULL NULL -6.6162112E8 NULL 1969-12-31 16:00:00.008 NULL 1969-12-24 00:12:58.862 1969-12-20 21:16:47.25 1969-12-31 16:00:08 NULL 1969-12-31 16:00:00 1969-12-31 16:00:00 1969-12-31 16:00:15.892 NULL NULL 8 NULL -661621138 -931392750 8.0 NULL FALSE 0 1969-12-31 16:00:15.892 L15l8i5k558tBcDV20 8.0 -1.323242276E9 0.9893582466233818 -6.61621138E8 +true NULL true true true NULL false false true true 8 NULL -102936434 -1312782750 8 NULL 0 15 NULL NULL 8 8 8 8.0 NULL -1.02936434E8 -1.31278275E9 8.0 NULL 0.0 15.892 NULL NULL -1.02936432E8 NULL 1969-12-31 16:00:00.008 NULL 1969-12-30 11:24:23.566 1969-12-16 11:20:17.25 1969-12-31 16:00:08 NULL 1969-12-31 16:00:00 1969-12-31 16:00:00 1969-12-31 16:00:15.892 NULL NULL 8 NULL -102936434 -1312782750 8.0 NULL FALSE 0 1969-12-31 16:00:15.892 eJROSNhugc3kQR7Pb 8.0 -2.05872868E8 0.9893582466233818 -1.02936434E8 +true NULL true true true NULL false false true true 8 NULL 805179664 868161500 8 NULL 0 15 NULL NULL 8 8 8 8.0 NULL 8.05179664E8 8.681615E8 8.0 NULL 0.0 15.892 NULL NULL 8.0517965E8 NULL 1969-12-31 16:00:00.008 NULL 1970-01-09 23:39:39.664 1970-01-10 17:09:21.5 1969-12-31 16:00:08 NULL 1969-12-31 16:00:00 1969-12-31 16:00:00 1969-12-31 16:00:15.892 NULL NULL 8 NULL 805179664 868161500 8.0 NULL FALSE 0 1969-12-31 16:00:15.892 e005B5q 8.0 1.610359328E9 0.9893582466233818 8.05179664E8 +true NULL true true true NULL false false true true 8 NULL -669632311 1588591250 8 NULL 0 15 NULL 3 8 8 8 8.0 NULL -6.69632311E8 1.58859125E9 8.0 NULL 0.0 15.892 NULL 3.0 -6.6963232E8 NULL 1969-12-31 16:00:00.008 NULL 1969-12-23 21:59:27.689 1970-01-19 01:16:31.25 1969-12-31 16:00:08 NULL 1969-12-31 16:00:00 1969-12-31 16:00:00 1969-12-31 16:00:15.892 NULL NULL 8 NULL -669632311 1588591250 8.0 NULL FALSE 0 1969-12-31 16:00:15.892 3r3sDvfUkG0yTP3LnX5mNQRr 8.0 -1.339264622E9 0.9893582466233818 -6.69632311E8 +true NULL true true true NULL true false true true 8 NULL 890988972 -1862301000 8 NULL 1 15 NULL NULL 8 8 8 8.0 NULL 8.90988972E8 -1.862301E9 8.0 NULL 1.0 15.892 NULL NULL 8.9098899E8 NULL 1969-12-31 16:00:00.008 NULL 1970-01-10 23:29:48.972 1969-12-10 02:41:39 1969-12-31 16:00:08 NULL 1969-12-31 16:00:00.001 1969-12-31 16:00:00 1969-12-31 16:00:15.892 NULL NULL 8 NULL 890988972 -1862301000 8.0 NULL TRUE 0 1969-12-31 16:00:15.892 XylAH4 8.0 1.781977944E9 0.9893582466233818 8.90988973E8 +true NULL true true true NULL true false true true 8 NULL 930867246 1205399250 8 NULL 1 15 NULL NULL 8 8 8 8.0 NULL 9.30867246E8 1.20539925E9 8.0 NULL 1.0 15.892 NULL NULL 9.3086726E8 NULL 1969-12-31 16:00:00.008 NULL 1970-01-11 10:34:27.246 1970-01-14 14:49:59.25 1969-12-31 16:00:08 NULL 1969-12-31 16:00:00.001 1969-12-31 16:00:00 1969-12-31 16:00:15.892 NULL NULL 8 NULL 930867246 1205399250 8.0 NULL TRUE 0 1969-12-31 16:00:15.892 c1V8o1A 8.0 1.861734492E9 0.9893582466233818 9.30867247E8 +true true NULL true true true NULL false true NULL -59 -7196 NULL -1604890000 -59 -7196 NULL 13 NULL NULL -59 -59 -59 -59.0 -7196.0 NULL -1.60489E9 -59.0 -7196.0 NULL 13.15 NULL NULL NULL -7196.0 1969-12-31 15:59:59.941 1969-12-31 15:59:52.804 NULL 1969-12-13 02:11:50 1969-12-31 15:59:01 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 16:00:13.15 NULL NULL -59 -7196 NULL -1604890000 -59.0 -7196.0 NULL 0 1969-12-31 16:00:13.15 NULL -59.0 NULL -0.6367380071391379 NULL +true true NULL true true true NULL false true NULL -21 -7196 NULL 1542429000 -21 -7196 NULL -4 NULL NULL -21 -21 -21 -21.0 -7196.0 NULL 1.542429E9 -21.0 -7196.0 NULL -4.1 NULL NULL NULL -7196.0 1969-12-31 15:59:59.979 1969-12-31 15:59:52.804 NULL 1970-01-18 12:27:09 1969-12-31 15:59:39 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 15:59:55.9 NULL NULL -21 -7196 NULL 1542429000 -21.0 -7196.0 NULL 0 1969-12-31 15:59:55.9 NULL -21.0 NULL -0.8366556385360561 NULL +true true NULL true true true NULL false true NULL -60 -7196 NULL 1516314750 -60 -7196 NULL -7 NULL NULL -60 -60 -60 -60.0 -7196.0 NULL 1.51631475E9 -60.0 -7196.0 NULL -7.592 NULL NULL NULL -7196.0 1969-12-31 15:59:59.94 1969-12-31 15:59:52.804 NULL 1970-01-18 05:11:54.75 1969-12-31 15:59:00 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 15:59:52.408 NULL NULL -60 -7196 NULL 1516314750 -60.0 -7196.0 NULL 0 1969-12-31 15:59:52.408 NULL -60.0 NULL 0.3048106211022167 NULL +true true NULL true true true NULL false true NULL -14 -7196 NULL -1552199500 -14 -7196 NULL 11 NULL NULL -14 -14 -14 -14.0 -7196.0 NULL -1.5521995E9 -14.0 -7196.0 NULL 11.065 NULL NULL NULL -7196.0 1969-12-31 15:59:59.986 1969-12-31 15:59:52.804 NULL 1969-12-13 16:50:00.5 1969-12-31 15:59:46 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 16:00:11.065 NULL NULL -14 -7196 NULL -1552199500 -14.0 -7196.0 NULL 0 1969-12-31 16:00:11.065 NULL -14.0 NULL -0.9906073556948704 NULL +true true NULL true true true NULL false true NULL 59 -7196 NULL -1137754500 59 -7196 NULL 10 NULL NULL 59 59 59 59.0 -7196.0 NULL -1.1377545E9 59.0 -7196.0 NULL 10.956 NULL NULL NULL -7196.0 1969-12-31 16:00:00.059 1969-12-31 15:59:52.804 NULL 1969-12-18 11:57:25.5 1969-12-31 16:00:59 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 16:00:10.956 NULL NULL 59 -7196 NULL -1137754500 59.0 -7196.0 NULL 0 1969-12-31 16:00:10.956 NULL 59.0 NULL 0.6367380071391379 NULL +true true NULL true true true NULL false true NULL -8 -7196 NULL -1849991500 -8 -7196 NULL 3 NULL NULL -8 -8 -8 -8.0 -7196.0 NULL -1.8499915E9 -8.0 -7196.0 NULL 3.136 NULL NULL NULL -7196.0 1969-12-31 15:59:59.992 1969-12-31 15:59:52.804 NULL 1969-12-10 06:06:48.5 1969-12-31 15:59:52 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 16:00:03.136 NULL NULL -8 -7196 NULL -1849991500 -8.0 -7196.0 NULL 0 1969-12-31 16:00:03.136 NULL -8.0 NULL -0.9893582466233818 NULL +true true NULL true true true NULL false true NULL 5 -7196 NULL -1015607500 5 -7196 NULL 10 NULL NULL 5 5 5 5.0 -7196.0 NULL -1.0156075E9 5.0 -7196.0 NULL 10.973 NULL NULL NULL -7196.0 1969-12-31 16:00:00.005 1969-12-31 15:59:52.804 NULL 1969-12-19 21:53:12.5 1969-12-31 16:00:05 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 16:00:10.973 NULL NULL 5 -7196 NULL -1015607500 5.0 -7196.0 NULL 0 1969-12-31 16:00:10.973 NULL 5.0 NULL -0.9589242746631385 NULL +true true NULL true true true NULL false true NULL -24 -7196 NULL 829111000 -24 -7196 NULL -6 NULL NULL -24 -24 -24 -24.0 -7196.0 NULL 8.29111E8 -24.0 -7196.0 NULL -6.855 NULL NULL NULL -7196.0 1969-12-31 15:59:59.976 1969-12-31 15:59:52.804 NULL 1970-01-10 06:18:31 1969-12-31 15:59:36 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 15:59:53.145 NULL NULL -24 -7196 NULL 829111000 -24.0 -7196.0 NULL 0 1969-12-31 15:59:53.145 NULL -24.0 NULL 0.9055783620066238 NULL +true true NULL true true true NULL false true NULL -50 -7196 NULL -1031187250 -50 -7196 NULL -5 NULL NULL -50 -50 -50 -50.0 -7196.0 NULL -1.03118725E9 -50.0 -7196.0 NULL -5.267 NULL NULL NULL -7196.0 1969-12-31 15:59:59.95 1969-12-31 15:59:52.804 NULL 1969-12-19 17:33:32.75 1969-12-31 15:59:10 1969-12-31 14:00:04 NULL 1969-12-31 16:00:00 1969-12-31 15:59:54.733 NULL NULL -50 -7196 NULL -1031187250 -50.0 -7196.0 NULL 0 1969-12-31 15:59:54.733 NULL -50.0 NULL 0.26237485370392877 NULL +true NULL true true true NULL true false true true 11 NULL -64615982 1803053750 11 NULL 1 2 NULL 8 11 11 11 11.0 NULL -6.4615982E7 1.80305375E9 11.0 NULL 1.0 2.351 NULL 8.0 -6.4615984E7 NULL 1969-12-31 16:00:00.011 NULL 1969-12-30 22:03:04.018 1970-01-21 12:50:53.75 1969-12-31 16:00:11 NULL 1969-12-31 16:00:00.001 1969-12-31 16:00:00 1969-12-31 16:00:02.351 NULL NULL 11 NULL -64615982 1803053750 11.0 NULL TRUE 0 1969-12-31 16:00:02.351 8J5OB7K26PEV7kdbeHr3 11.0 -1.29231964E8 -0.9999902065507035 -6.4615981E7 +true NULL true true true NULL true false true true 11 NULL -335450417 1233327000 11 NULL 1 2 NULL NULL 11 11 11 11.0 NULL -3.35450417E8 1.233327E9 11.0 NULL 1.0 2.351 NULL NULL -3.35450432E8 NULL 1969-12-31 16:00:00.011 NULL 1969-12-27 18:49:09.583 1970-01-14 22:35:27 1969-12-31 16:00:11 NULL 1969-12-31 16:00:00.001 1969-12-31 16:00:00 1969-12-31 16:00:02.351 NULL NULL 11 NULL -335450417 1233327000 11.0 NULL TRUE 0 1969-12-31 16:00:02.351 dOYnqgaXoJ1P3ERwxe5N7 11.0 -6.70900834E8 -0.9999902065507035 -3.35450416E8 diff --git a/ql/src/test/results/clientpositive/vectorized_math_funcs.q.out b/ql/src/test/results/clientpositive/vectorized_math_funcs.q.out new file mode 100644 index 0000000..99865a3 --- /dev/null +++ b/ql/src/test/results/clientpositive/vectorized_math_funcs.q.out @@ -0,0 +1,332 @@ +PREHOOK: query: -- Test math functions in vectorized mode to verify they run correctly end-to-end. +explain +select + cdouble + ,Round(cdouble, 2) + ,Floor(cdouble) + ,Ceil(cdouble) + ,Rand() + ,Rand(98007) + ,Exp(ln(cdouble)) + ,Ln(cdouble) + ,Ln(cfloat) + ,Log10(cdouble) + -- Use log2 as a representative function to test all input types. + ,Log2(cdouble) + ,Log2(cfloat) + ,Log2(cbigint) + ,Log2(cint) + ,Log2(csmallint) + ,Log2(ctinyint) + ,Log(2.0, cdouble) + ,Pow(log2(cdouble), 2.0) + ,Power(log2(cdouble), 2.0) + ,Sqrt(cdouble) + ,Sqrt(cbigint) + ,Bin(cbigint) + ,Hex(cdouble) + ,Conv(cbigint, 10, 16) + ,Abs(cdouble) + ,Abs(ctinyint) + ,Pmod(cint, 3) + ,Sin(cdouble) + ,Asin(cdouble) + ,Cos(cdouble) + ,ACos(cdouble) + ,Atan(cdouble) + ,Degrees(cdouble) + ,Radians(cdouble) + ,Positive(cdouble) + ,Positive(cbigint) + ,Negative(cdouble) + ,Sign(cdouble) + ,Sign(cbigint) + -- Test nesting + ,cos(-sin(log(cdouble)) + 3.14159) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 500 = 0 +-- test use of a math function in the WHERE clause +and sin(cfloat) >= -1.0 +PREHOOK: type: QUERY +POSTHOOK: query: -- Test math functions in vectorized mode to verify they run correctly end-to-end. +explain +select + cdouble + ,Round(cdouble, 2) + ,Floor(cdouble) + ,Ceil(cdouble) + ,Rand() + ,Rand(98007) + ,Exp(ln(cdouble)) + ,Ln(cdouble) + ,Ln(cfloat) + ,Log10(cdouble) + -- Use log2 as a representative function to test all input types. + ,Log2(cdouble) + ,Log2(cfloat) + ,Log2(cbigint) + ,Log2(cint) + ,Log2(csmallint) + ,Log2(ctinyint) + ,Log(2.0, cdouble) + ,Pow(log2(cdouble), 2.0) + ,Power(log2(cdouble), 2.0) + ,Sqrt(cdouble) + ,Sqrt(cbigint) + ,Bin(cbigint) + ,Hex(cdouble) + ,Conv(cbigint, 10, 16) + ,Abs(cdouble) + ,Abs(ctinyint) + ,Pmod(cint, 3) + ,Sin(cdouble) + ,Asin(cdouble) + ,Cos(cdouble) + ,ACos(cdouble) + ,Atan(cdouble) + ,Degrees(cdouble) + ,Radians(cdouble) + ,Positive(cdouble) + ,Positive(cbigint) + ,Negative(cdouble) + ,Sign(cdouble) + ,Sign(cbigint) + -- Test nesting + ,cos(-sin(log(cdouble)) + 3.14159) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 500 = 0 +-- test use of a math function in the WHERE clause +and sin(cfloat) >= -1.0 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME alltypesorc))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL cdouble)) (TOK_SELEXPR (TOK_FUNCTION Round (TOK_TABLE_OR_COL cdouble) 2)) (TOK_SELEXPR (TOK_FUNCTION Floor (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Ceil (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Rand)) (TOK_SELEXPR (TOK_FUNCTION Rand 98007)) (TOK_SELEXPR (TOK_FUNCTION Exp (TOK_FUNCTION ln (TOK_TABLE_OR_COL cdouble)))) (TOK_SELEXPR (TOK_FUNCTION Ln (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Ln (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION Log10 (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Log2 (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Log2 (TOK_TABLE_OR_COL cfloat))) (TOK_SELEXPR (TOK_FUNCTION Log2 (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION Log2 (TOK_TABLE_OR_COL cint))) (TOK_SELEXPR (TOK_FUNCTION Log2 (TOK_TABLE_OR_COL csmallint))) (TOK_SELEXPR (TOK_FUNCTION Log2 (TOK_TABLE_OR_COL ctinyint))) (TOK_SELEXPR (TOK_FUNCTION Log 2.0 (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Pow (TOK_FUNCTION log2 (TOK_TABLE_OR_COL cdouble)) 2.0)) (TOK_SELEXPR (TOK_FUNCTION Power (TOK_FUNCTION log2 (TOK_TABLE_OR_COL cdouble)) 2.0)) (TOK_SELEXPR (TOK_FUNCTION Sqrt (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Sqrt (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION Bin (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION Hex (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Conv (TOK_TABLE_OR_COL cbigint) 10 16)) (TOK_SELEXPR (TOK_FUNCTION Abs (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Abs (TOK_TABLE_OR_COL ctinyint))) (TOK_SELEXPR (TOK_FUNCTION Pmod (TOK_TABLE_OR_COL cint) 3)) (TOK_SELEXPR (TOK_FUNCTION Sin (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Asin (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Cos (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION ACos (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Atan (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Degrees (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Radians (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Positive (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Positive (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION Negative (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Sign (TOK_TABLE_OR_COL cdouble))) (TOK_SELEXPR (TOK_FUNCTION Sign (TOK_TABLE_OR_COL cbigint))) (TOK_SELEXPR (TOK_FUNCTION cos (+ (- (TOK_FUNCTION sin (TOK_FUNCTION log (TOK_TABLE_OR_COL cdouble)))) 3.14159)))) (TOK_WHERE (and (= (% (TOK_TABLE_OR_COL cbigint) 500) 0) (>= (TOK_FUNCTION sin (TOK_TABLE_OR_COL cfloat)) (- 1.0)))))) +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + alltypesorc + TableScan + alias: alltypesorc + Filter Operator + predicate: + expr: (((cbigint % 500) = 0) and (sin(cfloat) >= (- 1.0))) + type: boolean + Vectorized execution: true + Select Operator + expressions: + expr: cdouble + type: double + expr: round(cdouble, 2) + type: double + expr: floor(cdouble) + type: bigint + expr: ceil(cdouble) + type: bigint + expr: rand() + type: double + expr: rand(98007) + type: double + expr: exp(ln(cdouble)) + type: double + expr: ln(cdouble) + type: double + expr: ln(cfloat) + type: double + expr: log10(cdouble) + type: double + expr: log2(cdouble) + type: double + expr: log2(cfloat) + type: double + expr: log2(cbigint) + type: double + expr: log2(cint) + type: double + expr: log2(csmallint) + type: double + expr: log2(ctinyint) + type: double + expr: log(2.0, cdouble) + type: double + expr: pow(log2(cdouble), 2.0) + type: double + expr: power(log2(cdouble), 2.0) + type: double + expr: sqrt(cdouble) + type: double + expr: sqrt(cbigint) + type: double + expr: bin(cbigint) + type: string + expr: hex(cdouble) + type: string + expr: conv(cbigint, 10, 16) + type: string + expr: abs(cdouble) + type: double + expr: abs(ctinyint) + type: int + expr: pmod(cint, 3) + type: int + expr: sin(cdouble) + type: double + expr: asin(cdouble) + type: double + expr: cos(cdouble) + type: double + expr: acos(cdouble) + type: double + expr: atan(cdouble) + type: double + expr: degrees(cdouble) + type: double + expr: radians(cdouble) + type: double + expr: cdouble + type: double + expr: cbigint + type: bigint + expr: (- cdouble) + type: double + expr: sign(cdouble) + type: double + expr: sign(cbigint) + type: double + expr: cos(((- sin(log(cdouble))) + 3.14159)) + type: double + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13, _col14, _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23, _col24, _col25, _col26, _col27, _col28, _col29, _col30, _col31, _col32, _col33, _col34, _col35, _col36, _col37, _col38, _col39 + Vectorized execution: true + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Vectorized execution: true + Stage: Stage-0 + Fetch Operator + limit: -1 +PREHOOK: query: select + cdouble + ,Round(cdouble, 2) + ,Floor(cdouble) + ,Ceil(cdouble) + -- Omit rand() from runtime test because it's nondeterministic. + -- ,Rand() + ,Rand(98007) + ,Exp(ln(cdouble)) + ,Ln(cdouble) + ,Ln(cfloat) + ,Log10(cdouble) + -- Use log2 as a representative function to test all input types. + ,Log2(cdouble) + ,Log2(cfloat) + ,Log2(cbigint) + ,Log2(cint) + ,Log2(csmallint) + ,Log2(ctinyint) + ,Log(2.0, cdouble) + ,Pow(log2(cdouble), 2.0) + ,Power(log2(cdouble), 2.0) + ,Sqrt(cdouble) + ,Sqrt(cbigint) + ,Bin(cbigint) + ,Hex(cdouble) + ,Conv(cbigint, 10, 16) + ,Abs(cdouble) + ,Abs(ctinyint) + ,Pmod(cint, 3) + ,Sin(cdouble) + ,Asin(cdouble) + ,Cos(cdouble) + ,ACos(cdouble) + ,Atan(cdouble) + ,Degrees(cdouble) + ,Radians(cdouble) + ,Positive(cdouble) + ,Positive(cbigint) + ,Negative(cdouble) + ,Sign(cdouble) + ,Sign(cbigint) + -- Test nesting + ,cos(-sin(log(cdouble)) + 3.14159) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 500 = 0 +-- test use of a math function in the WHERE clause +and sin(cfloat) >= -1.0 +PREHOOK: type: QUERY +PREHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +POSTHOOK: query: select + cdouble + ,Round(cdouble, 2) + ,Floor(cdouble) + ,Ceil(cdouble) + -- Omit rand() from runtime test because it's nondeterministic. + -- ,Rand() + ,Rand(98007) + ,Exp(ln(cdouble)) + ,Ln(cdouble) + ,Ln(cfloat) + ,Log10(cdouble) + -- Use log2 as a representative function to test all input types. + ,Log2(cdouble) + ,Log2(cfloat) + ,Log2(cbigint) + ,Log2(cint) + ,Log2(csmallint) + ,Log2(ctinyint) + ,Log(2.0, cdouble) + ,Pow(log2(cdouble), 2.0) + ,Power(log2(cdouble), 2.0) + ,Sqrt(cdouble) + ,Sqrt(cbigint) + ,Bin(cbigint) + ,Hex(cdouble) + ,Conv(cbigint, 10, 16) + ,Abs(cdouble) + ,Abs(ctinyint) + ,Pmod(cint, 3) + ,Sin(cdouble) + ,Asin(cdouble) + ,Cos(cdouble) + ,ACos(cdouble) + ,Atan(cdouble) + ,Degrees(cdouble) + ,Radians(cdouble) + ,Positive(cdouble) + ,Positive(cbigint) + ,Negative(cdouble) + ,Sign(cdouble) + ,Sign(cbigint) + -- Test nesting + ,cos(-sin(log(cdouble)) + 3.14159) +from alltypesorc +-- limit output to a reasonably small number of rows +where cbigint % 500 = 0 +-- test use of a math function in the WHERE clause +and sin(cfloat) >= -1.0 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +-200.0 -200.0 -200 -200 0.8199077823142826 NULL NULL NULL NULL NULL NULL 30.57531565116074 NULL NULL NULL NULL NULL NULL NULL 39998.48747140321 1011111010111000011011101011000 2D3230302E30 5F5C3758 200.0 36 NULL 0.8732972972139946 NaN 0.4871876750070059 NaN -1.5657963684609384 -11459.155902616465 -3.490658503988659 -200.0 1599879000 200.0 -1.0 1.0 NULL +15601.0 15601.0 15601 15601 0.38656833237681376 15601.00000000001 9.65509029374725 NULL 4.193152436852078 13.929350886124324 NULL NULL NULL 13.929350886124324 NULL 13.929350886124324 194.02681610877246 194.02681610877246 124.90396310766124 NULL 1111111111111111111111111111111110010001001101101010100000011000 31353630312E30 FFFFFFFF9136A818 15601.0 38 NULL -0.14856570831397706 NaN 0.9889025383288114 NaN 1.5707322283397571 893871.4561835973 272.2888166036353 15601.0 -1858689000 -15601.0 1.0 -1.0 -0.9740573096878733 +15601.0 15601.0 15601 15601 0.41161398527282966 15601.00000000001 9.65509029374725 NULL 4.193152436852078 13.929350886124324 NULL 29.18993673432575 NULL 13.929350886124324 NULL 13.929350886124324 194.02681610877246 194.02681610877246 124.90396310766124 24747.04022706554 100100100000001011101000000000 31353630312E30 2480BA00 15601.0 5 NULL -0.14856570831397706 NaN 0.9889025383288114 NaN 1.5707322283397571 893871.4561835973 272.2888166036353 15601.0 612416000 -15601.0 1.0 1.0 -0.9740573096878733 +15601.0 15601.0 15601 15601 0.37807863784568585 15601.00000000001 9.65509029374725 3.871201010907891 4.193152436852078 13.929350886124324 5.584962500721157 NULL NULL 13.929350886124324 5.584962500721157 13.929350886124324 194.02681610877246 194.02681610877246 124.90396310766124 NULL 1111111111111111111111111111111111010000100101111100000100011000 31353630312E30 FFFFFFFFD097C118 15601.0 48 NULL -0.14856570831397706 NaN 0.9889025383288114 NaN 1.5707322283397571 893871.4561835973 272.2888166036353 15601.0 -795361000 -15601.0 1.0 -1.0 -0.9740573096878733 +NULL NULL NULL NULL 0.3336458983920575 NULL NULL 2.0794415416798357 NULL NULL 3.0 29.693388204506274 29.58473549442715 NULL 3.0 NULL NULL NULL NULL 29464.580431426475 110011101111110001011111011100 NULL 33BF17DC NULL 8 1 NULL NULL NULL NULL NULL NULL NULL NULL 868161500 NULL NULL 1.0 NULL +NULL NULL NULL NULL 0.8681331660942196 NULL NULL 2.0794415416798357 NULL NULL 3.0 NULL 29.730832334348488 NULL 3.0 NULL NULL NULL NULL NULL 1111111111111111111111111111111110010000111111111000101010111000 NULL FFFFFFFF90FF8AB8 NULL 8 0 NULL NULL NULL NULL NULL NULL NULL NULL -1862301000 NULL NULL -1.0 NULL +-7196.0 -7196.0 -7196 -7196 0.03951015606275099 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1111111111111111111111111111111110100000010101110101001001110000 2D373139362E30 FFFFFFFFA0575270 7196.0 59 NULL -0.9834787875028149 NaN -0.18102340879563897 NaN -1.5706573607035177 -412300.4293761404 -125.59389297351194 -7196.0 -1604890000 7196.0 -1.0 -1.0 NULL +-7196.0 -7196.0 -7196 -7196 0.9209252022050654 NULL NULL NULL NULL NULL NULL 30.52255693577237 NULL NULL NULL NULL NULL NULL NULL 39273.76987252433 1011011111011111001100101001000 2D373139362E30 5BEF9948 7196.0 21 NULL -0.9834787875028149 NaN -0.18102340879563897 NaN -1.5706573607035177 -412300.4293761404 -125.59389297351194 -7196.0 1542429000 7196.0 -1.0 1.0 NULL +-7196.0 -7196.0 -7196 -7196 0.4533660450429132 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1111111111111111111111111111111110100011011110110101000010110100 2D373139362E30 FFFFFFFFA37B50B4 7196.0 14 NULL -0.9834787875028149 NaN -0.18102340879563897 NaN -1.5706573607035177 -412300.4293761404 -125.59389297351194 -7196.0 -1552199500 7196.0 -1.0 -1.0 NULL +-7196.0 -7196.0 -7196 -7196 0.14567136069921982 NULL NULL 4.07753744390572 NULL NULL 5.882643049361842 NULL NULL NULL 5.882643049361842 NULL NULL NULL NULL NULL 1111111111111111111111111111111110111100001011110011111001111100 2D373139362E30 FFFFFFFFBC2F3E7C 7196.0 59 NULL -0.9834787875028149 NaN -0.18102340879563897 NaN -1.5706573607035177 -412300.4293761404 -125.59389297351194 -7196.0 -1137754500 7196.0 -1.0 -1.0 NULL +-7196.0 -7196.0 -7196 -7196 0.5264452612398715 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1111111111111111111111111111111110010001101110110101111010110100 2D373139362E30 FFFFFFFF91BB5EB4 7196.0 8 NULL -0.9834787875028149 NaN -0.18102340879563897 NaN -1.5706573607035177 -412300.4293761404 -125.59389297351194 -7196.0 -1849991500 7196.0 -1.0 -1.0 NULL +-7196.0 -7196.0 -7196 -7196 0.17837094616515647 NULL NULL 1.6094379124341003 NULL NULL 2.321928094887362 NULL NULL NULL 2.321928094887362 NULL NULL NULL NULL NULL 1111111111111111111111111111111111000011011101110000111100110100 2D373139362E30 FFFFFFFFC3770F34 7196.0 5 NULL -0.9834787875028149 NaN -0.18102340879563897 NaN -1.5706573607035177 -412300.4293761404 -125.59389297351194 -7196.0 -1015607500 7196.0 -1.0 -1.0 NULL +-7196.0 -7196.0 -7196 -7196 0.5456857574763374 NULL NULL NULL NULL NULL NULL 29.62699001935971 NULL NULL NULL NULL NULL NULL NULL 28794.287627930647 110001011010110011101011011000 2D373139362E30 316B3AD8 7196.0 24 NULL -0.9834787875028149 NaN -0.18102340879563897 NaN -1.5706573607035177 -412300.4293761404 -125.59389297351194 -7196.0 829111000 7196.0 -1.0 1.0 NULL +NULL NULL NULL NULL 0.282703740641956 NULL NULL 2.3978952727983707 NULL NULL 3.4594316186372978 30.19990821555368 NULL NULL 3.4594316186372978 NULL NULL NULL NULL 35118.75567271711 1001001100000110001001110011000 NULL 49831398 NULL 11 1 NULL NULL NULL NULL NULL NULL NULL NULL 1233327000 NULL NULL 1.0 NULL diff --git a/ql/src/test/results/clientpositive/vectorized_string_funcs.q.out b/ql/src/test/results/clientpositive/vectorized_string_funcs.q.out new file mode 100644 index 0000000..ddf5d95 --- /dev/null +++ b/ql/src/test/results/clientpositive/vectorized_string_funcs.q.out @@ -0,0 +1,162 @@ +PREHOOK: query: -- Test string functions in vectorized mode to verify end-to-end functionality. +explain +select + substr(cstring1, 1, 2) + ,substr(cstring1, 2) + ,lower(cstring1) + ,upper(cstring1) + ,ucase(cstring1) + ,length(cstring1) + ,trim(cstring1) + ,ltrim(cstring1) + ,rtrim(cstring1) + ,concat(cstring1, cstring2) + ,concat('>', cstring1) + ,concat(cstring1, '<') + ,concat(substr(cstring1, 1, 2), substr(cstring2, 1, 2)) +from alltypesorc +-- Limit the number of rows of output to a reasonable amount. +where cbigint % 237 = 0 +-- Test function use in the WHERE clause. +and length(substr(cstring1, 1, 2)) <= 2 +and cstring1 like '%' +PREHOOK: type: QUERY +POSTHOOK: query: -- Test string functions in vectorized mode to verify end-to-end functionality. +explain +select + substr(cstring1, 1, 2) + ,substr(cstring1, 2) + ,lower(cstring1) + ,upper(cstring1) + ,ucase(cstring1) + ,length(cstring1) + ,trim(cstring1) + ,ltrim(cstring1) + ,rtrim(cstring1) + ,concat(cstring1, cstring2) + ,concat('>', cstring1) + ,concat(cstring1, '<') + ,concat(substr(cstring1, 1, 2), substr(cstring2, 1, 2)) +from alltypesorc +-- Limit the number of rows of output to a reasonable amount. +where cbigint % 237 = 0 +-- Test function use in the WHERE clause. +and length(substr(cstring1, 1, 2)) <= 2 +and cstring1 like '%' +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME alltypesorc))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION substr (TOK_TABLE_OR_COL cstring1) 1 2)) (TOK_SELEXPR (TOK_FUNCTION substr (TOK_TABLE_OR_COL cstring1) 2)) (TOK_SELEXPR (TOK_FUNCTION lower (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION upper (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION ucase (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION length (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION trim (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION ltrim (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION rtrim (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION concat (TOK_TABLE_OR_COL cstring1) (TOK_TABLE_OR_COL cstring2))) (TOK_SELEXPR (TOK_FUNCTION concat '>' (TOK_TABLE_OR_COL cstring1))) (TOK_SELEXPR (TOK_FUNCTION concat (TOK_TABLE_OR_COL cstring1) '<')) (TOK_SELEXPR (TOK_FUNCTION concat (TOK_FUNCTION substr (TOK_TABLE_OR_COL cstring1) 1 2) (TOK_FUNCTION substr (TOK_TABLE_OR_COL cstring2) 1 2)))) (TOK_WHERE (and (and (= (% (TOK_TABLE_OR_COL cbigint) 237) 0) (<= (TOK_FUNCTION length (TOK_FUNCTION substr (TOK_TABLE_OR_COL cstring1) 1 2)) 2)) (like (TOK_TABLE_OR_COL cstring1) '%'))))) +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + alltypesorc + TableScan + alias: alltypesorc + Filter Operator + predicate: + expr: ((((cbigint % 237) = 0) and (length(substr(cstring1, 1, 2)) <= 2)) and (cstring1 like '%')) + type: boolean + Vectorized execution: true + Select Operator + expressions: + expr: substr(cstring1, 1, 2) + type: string + expr: substr(cstring1, 2) + type: string + expr: lower(cstring1) + type: string + expr: upper(cstring1) + type: string + expr: upper(cstring1) + type: string + expr: length(cstring1) + type: int + expr: trim(cstring1) + type: string + expr: ltrim(cstring1) + type: string + expr: rtrim(cstring1) + type: string + expr: concat(cstring1, cstring2) + type: string + expr: concat('>', cstring1) + type: string + expr: concat(cstring1, '<') + type: string + expr: concat(substr(cstring1, 1, 2), substr(cstring2, 1, 2)) + type: string + outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12 + Vectorized execution: true + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + Vectorized execution: true + Stage: Stage-0 + Fetch Operator + limit: -1 +PREHOOK: query: select + substr(cstring1, 1, 2) + ,substr(cstring1, 2) + ,lower(cstring1) + ,upper(cstring1) + ,ucase(cstring1) + ,length(cstring1) + ,trim(cstring1) + ,ltrim(cstring1) + ,rtrim(cstring1) + ,concat(cstring1, cstring2) + ,concat('>', cstring1) + ,concat(cstring1, '<') + ,concat(substr(cstring1, 1, 2), substr(cstring2, 1, 2)) +from alltypesorc +-- Limit the number of rows of output to a reasonable amount. +where cbigint % 237 = 0 +-- Test function use in the WHERE clause. +and length(substr(cstring1, 1, 2)) <= 2 +and cstring1 like '%' +PREHOOK: type: QUERY +PREHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +POSTHOOK: query: select + substr(cstring1, 1, 2) + ,substr(cstring1, 2) + ,lower(cstring1) + ,upper(cstring1) + ,ucase(cstring1) + ,length(cstring1) + ,trim(cstring1) + ,ltrim(cstring1) + ,rtrim(cstring1) + ,concat(cstring1, cstring2) + ,concat('>', cstring1) + ,concat(cstring1, '<') + ,concat(substr(cstring1, 1, 2), substr(cstring2, 1, 2)) +from alltypesorc +-- Limit the number of rows of output to a reasonable amount. +where cbigint % 237 = 0 +-- Test function use in the WHERE clause. +and length(substr(cstring1, 1, 2)) <= 2 +and cstring1 like '%' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@alltypesorc +#### A masked pattern was here #### +Vi iqXS6s88N1yr14lj7I viqxs6s88n1yr14lj7i VIQXS6S88N1YR14LJ7I VIQXS6S88N1YR14LJ7I 19 ViqXS6s88N1yr14lj7I ViqXS6s88N1yr14lj7I ViqXS6s88N1yr14lj7I ViqXS6s88N1yr14lj7ITh638b67kn8o >ViqXS6s88N1yr14lj7I ViqXS6s88N1yr14lj7I< ViTh +R4 4e7Gf r4e7gf R4E7GF R4E7GF 6 R4e7Gf R4e7Gf R4e7Gf R4e7GfPTBh56R3LS7L13sB4 >R4e7Gf R4e7Gf< R4PT +3g gubGh4J18TV 3gubgh4j18tv 3GUBGH4J18TV 3GUBGH4J18TV 12 3gubGh4J18TV 3gubGh4J18TV 3gubGh4J18TV 3gubGh4J18TVpJucOe4dN4R5XURJW8 >3gubGh4J18TV 3gubGh4J18TV< 3gpJ +EP PCRx8ObNv51rOF epcrx8obnv51rof EPCRX8OBNV51ROF EPCRX8OBNV51ROF 15 EPCRx8ObNv51rOF EPCRx8ObNv51rOF EPCRx8ObNv51rOF EPCRx8ObNv51rOFysaU2Xm11f715L0I35rut2 >EPCRx8ObNv51rOF EPCRx8ObNv51rOF< EPys +8e eiti74gc5m01xyMKSjUIx 8eiti74gc5m01xymksjuix 8EITI74GC5M01XYMKSJUIX 8EITI74GC5M01XYMKSJUIX 22 8eiti74gc5m01xyMKSjUIx 8eiti74gc5m01xyMKSjUIx 8eiti74gc5m01xyMKSjUIx 8eiti74gc5m01xyMKSjUIxI8x87Fm1J4hE8g4CWNo >8eiti74gc5m01xyMKSjUIx 8eiti74gc5m01xyMKSjUIx< 8eI8 +m0 0hbv1516qk8 m0hbv1516qk8 M0HBV1516QK8 M0HBV1516QK8 12 m0hbv1516qk8 m0hbv1516qk8 m0hbv1516qk8 m0hbv1516qk8N8i3sxF54C4x5h0 >m0hbv1516qk8 m0hbv1516qk8< m0N8 +uT T5e2 ut5e2 UT5E2 UT5E2 5 uT5e2 uT5e2 uT5e2 uT5e2SJp57VKYsDtA2r1Xb2H >uT5e2 uT5e2< uTSJ +l3 35W8012cM77E227Ts l35w8012cm77e227ts L35W8012CM77E227TS L35W8012CM77E227TS 18 l35W8012cM77E227Ts l35W8012cM77E227Ts l35W8012cM77E227Ts l35W8012cM77E227TsMH38bE >l35W8012cM77E227Ts l35W8012cM77E227Ts< l3MH +o1 1uPH5EflET5ts1RjSB74 o1uph5eflet5ts1rjsb74 O1UPH5EFLET5TS1RJSB74 O1UPH5EFLET5TS1RJSB74 21 o1uPH5EflET5ts1RjSB74 o1uPH5EflET5ts1RjSB74 o1uPH5EflET5ts1RjSB74 o1uPH5EflET5ts1RjSB74a1U3DRA788kW7I0UTF203 >o1uPH5EflET5ts1RjSB74 o1uPH5EflET5ts1RjSB74< o1a1 +Ix x8dXlDbC3S44L1FQJqpwa ix8dxldbc3s44l1fqjqpwa IX8DXLDBC3S44L1FQJQPWA IX8DXLDBC3S44L1FQJQPWA 22 Ix8dXlDbC3S44L1FQJqpwa Ix8dXlDbC3S44L1FQJqpwa Ix8dXlDbC3S44L1FQJqpwa Ix8dXlDbC3S44L1FQJqpwa8wQR4X28CiccBVXGqPL7 >Ix8dXlDbC3S44L1FQJqpwa Ix8dXlDbC3S44L1FQJqpwa< Ix8w +OT Tn0Dj2HiBi05Baq1Xt otn0dj2hibi05baq1xt OTN0DJ2HIBI05BAQ1XT OTN0DJ2HIBI05BAQ1XT 19 OTn0Dj2HiBi05Baq1Xt OTn0Dj2HiBi05Baq1Xt OTn0Dj2HiBi05Baq1Xt OTn0Dj2HiBi05Baq1XtAoQ21J1lQ27kYSmfA >OTn0Dj2HiBi05Baq1Xt OTn0Dj2HiBi05Baq1Xt< OTAo +a0 0P3sn1ihxJCsTLDb a0p3sn1ihxjcstldb A0P3SN1IHXJCSTLDB A0P3SN1IHXJCSTLDB 17 a0P3sn1ihxJCsTLDb a0P3sn1ihxJCsTLDb a0P3sn1ihxJCsTLDb a0P3sn1ihxJCsTLDbfT4Jlw38k8kmd6Dt1wv >a0P3sn1ihxJCsTLDb a0P3sn1ihxJCsTLDb< a0fT