15 package com.cloudera.impala.analysis;
17 import java.util.ArrayList;
18 import java.util.HashMap;
25 import com.cloudera.impala.thrift.TFunctionBinaryType;
26 import com.cloudera.impala.thrift.TSymbolType;
27 import com.google.common.base.Preconditions;
48 HdfsUri location,
boolean ifNotExists,
49 HashMap<CreateFunctionStmtBase.OptArg, String> optArgs) {
50 super(fnSymbol, args, retTypeDef, location, ifNotExists, optArgs);
55 throw new AnalysisException(
"Could not infer symbol for "
56 +
function +
"() function.");
71 if (updateFn.startsWith(
"_Z"))
return null;
73 if (updateFn.contains(
"update"))
return updateFn.replace(
"update", defaultSymbol);
74 if (updateFn.contains(
"Update")) {
75 char[] array = defaultSymbol.toCharArray();
76 array[0] = Character.toUpperCase(array[0]);
77 String s =
new String(array);
78 return updateFn.replace(
"Update", s);
85 super.analyze(analyzer);
86 Preconditions.checkNotNull(
fn_);
90 if (uda.getNumArgs() == 0) {
94 if (uda.getBinaryType() == TFunctionBinaryType.HIVE) {
100 if (uda.getBinaryType() == TFunctionBinaryType.IR) {
108 "UDAs with more than 8 arguments are not yet supported.");
112 throw new AnalysisException(
"UDAs with CHAR return type are not yet supported.");
115 throw new AnalysisException(
"UDAs with VARCHAR return type are not yet supported.");
117 for (
int i = 0; i < uda.getNumArgs(); ++i) {
122 throw new AnalysisException(
"UDAs with VARCHAR arguments are not yet supported.");
126 Type intermediateType = null;
128 intermediateType = uda.getReturnType();
130 intermediateTypeDef_.analyze(analyzer);
131 intermediateType = intermediateTypeDef_.getType();
133 uda.setIntermediateType(intermediateType);
138 StringBuilder error =
new StringBuilder();
139 error.append(
"UDAs with an intermediate type, ")
140 .append(intermediateType.
toSql())
141 .append(
", that is different from the return type, ")
142 .append(fn_.getReturnType().
toSql())
143 .append(
", are currently not supported.");
153 uda.setUpdateFnSymbol(uda.lookupSymbol(
155 uda.hasVarArgs(), uda.getArgs()));
159 Preconditions.checkNotNull(uda.getUpdateFnSymbol());
170 uda.setInitFnSymbol(uda.lookupSymbol(uda.getInitFnSymbol(),
171 TSymbolType.UDF_EVALUATE, intermediateType,
false));
172 uda.setMergeFnSymbol(uda.lookupSymbol(uda.getMergeFnSymbol(),
173 TSymbolType.UDF_EVALUATE, intermediateType,
false, intermediateType));
174 if (uda.getSerializeFnSymbol() != null) {
176 uda.setSerializeFnSymbol(uda.lookupSymbol(uda.getSerializeFnSymbol(),
177 TSymbolType.UDF_EVALUATE, null,
false, intermediateType));
183 uda.setSerializeFnSymbol(null);
187 if (uda.getFinalizeFnSymbol() != null) {
189 uda.setFinalizeFnSymbol(uda.lookupSymbol(
190 uda.getFinalizeFnSymbol(), TSymbolType.UDF_EVALUATE, null,
false,
197 uda.setFinalizeFnSymbol(null);
205 uda.getFinalizeFnSymbol() == null) {
209 StringBuilder sb =
new StringBuilder(
"CREATE ");
210 sb.append(
"AGGREGATE FUNCTION ");
212 sb.append(uda.signatureString())
213 .append(
" RETURNS ").append(uda.getReturnType())
214 .append(
" INTERMEDIATE ").append(uda.getIntermediateType())
215 .append(
" LOCATION ").append(uda.getLocation())
216 .append(
" UPDATE_FN=").append(uda.getUpdateFnSymbol())
217 .append(
" INIT_FN=").append(uda.getInitFnSymbol())
218 .append(
" MERGE_FN=").append(uda.getMergeFnSymbol());
219 if (uda.getSerializeFnSymbol() != null) {
220 sb.append(
" SERIALIZE_FN=").append(uda.getSerializeFnSymbol());
222 if (uda.getFinalizeFnSymbol() != null) {
223 sb.append(
" FINALIZE_FN=").append(uda.getFinalizeFnSymbol());
231 Type retType,
boolean hasVarArgs) {
void checkOptArgNotSet(OptArg key)
String checkAndGetOptArg(OptArg key)
final TypeDef intermediateTypeDef_
CreateUdaStmt(FunctionName fnSymbol, FunctionArgs args, TypeDef retTypeDef, TypeDef intermediateTypeDef, HdfsUri location, boolean ifNotExists, HashMap< CreateFunctionStmtBase.OptArg, String > optArgs)
String getSymbolSymbol(OptArg arg, String defaultSymbol)
final HashMap< CreateFunctionStmtBase.OptArg, String > optArgs_
void analyze(Analyzer analyzer)
final FunctionName fnName_
ArrayList< Type > getArgTypes()
Function createFunction(FunctionName fnName, ArrayList< Type > argTypes, Type retType, boolean hasVarArgs)
void reportCouldNotInferSymbol(String function)
final boolean ifNotExists_