18 #include <boost/algorithm/string.hpp>
19 #include <boost/algorithm/string/regex.hpp>
23 using boost::algorithm::split_regex;
25 using namespace impala;
60 char* mangled_name = abi::__cxa_demangle(name.c_str(), NULL, NULL, &status);
61 if (status == 0) result = mangled_name;
62 if (mangled_name != NULL) free(mangled_name);
69 fn_name = fn_name.substr(0, fn_name.find(
'('));
71 fn_name = fn_name.substr(fn_name.find_last_of(
':') + 1);
79 (*out) << s.size() << s;
96 char* ptr = buffer + 10;
97 if (seq_id == 0) *--ptr =
'0';
100 char c =
static_cast<char>(seq_id % 36);
101 *--ptr = (c < 10 ?
'0' + c :
'A' + c - 10);
105 out->write(ptr, 10 - (ptr - buffer));
155 const vector<ColumnType>& arg_types,
bool has_var_args,
158 vector<string> name_tokens;
159 split_regex(name_tokens, fn_name, regex(
"::"));
167 int impala_udf_seq_id = -1;
171 if (name_tokens.size() > 1) {
173 seq_id += name_tokens.size() - 1;
175 for (
int i = 0; i < name_tokens.size(); ++i) {
178 if (name_tokens.size() > 1) ss <<
"E";
181 impala_udf_seq_id = seq_id++;
186 map<PrimitiveType, int> argument_map;
187 for (
int i = 0; i < arg_types.size(); ++i) {
188 int repeated_symbol_idx = -1;
189 if (argument_map.find(arg_types[i].type) != argument_map.end()) {
190 repeated_symbol_idx = argument_map[arg_types[i].type];
193 if (has_var_args && i == arg_types.size() - 1) {
198 if (repeated_symbol_idx > 0) {
203 if (repeated_symbol_idx > 0) {
214 argument_map[arg_types[i].type] = seq_id;
218 if (ret_arg_type != NULL) {
219 int repeated_symbol_idx = -1;
220 if (argument_map.find(ret_arg_type->
type) != argument_map.end()) {
221 repeated_symbol_idx = argument_map[ret_arg_type->
type];
225 if (repeated_symbol_idx != -1) {
238 vector<string> name_tokens;
239 split_regex(name_tokens, fn_name, regex(
"::"));
248 if (name_tokens.size() > 1) {
250 seq_id += name_tokens.size() - 1;
252 for (
int i = 0; i < name_tokens.size(); ++i) {
255 if (name_tokens.size() > 1) ss <<
"E";
static void AppendMangledToken(const string &s, stringstream *out)
static std::string ManglePrepareOrCloseFunction(const std::string &fn_name)
std::string DebugString() const
static bool IsMangled(const std::string &symbol)
Returns true if this symbol is mangled.
static void AppendAnyValType(int namespace_id, const ColumnType &type, stringstream *s)
static std::string Demangle(const std::string &name)
const char * MANGLE_PREFIX
static std::string MangleUserFunction(const std::string &fn_name, const std::vector< ColumnType > &arg_types, bool has_var_args=false, ColumnType *ret_argument=NULL)
static void AppendSeqId(int seq_id, stringstream *out)
static std::string DemangleNameOnly(const std::string &symbol)