def _parse_column_name_list_from_query(query): from grt.modules import MysqlSqlFacade ast_list = MysqlSqlFacade.parseAstFromSqlScript(query) for ast in ast_list: if type(ast) is str: continue else: s, v, c, _base, _begin, _end = ast trimmed_ast = trim_ast(ast) select_item_list = find_child_node(trimmed_ast, "select_item_list") if select_item_list: columns = [] variables = [] index = 0 for node in node_children(select_item_list): if node_symbol(node) == "select_item": index += 1 ident = find_child_node(find_child_node(node, "expr"), "ident") alias = find_child_node(find_child_node(node, "select_alias"), "ident") if not alias: if ident: name = node_value(ident) else: name = "field%i" % index else: name = node_value(alias) columns.append(name) helper = ASTHelper(query) begin, end = helper.get_ast_range(ast) # dump_tree(sys.stdout, ast) query = query[begin:end] offset = begin vars = find_child_nodes(ast, "variable") for var in reversed(vars): begin, end = helper.get_ast_range(var) begin -= offset end -= offset name = query[begin:end] query = query[:begin] + "?" + query[end:] variables.insert(0, name) return query, columns, variables
def _parse_column_name_list_from_query(query): from grt.modules import MysqlSqlFacade ast_list = MysqlSqlFacade.parseAstFromSqlScript(query) for ast in ast_list: if type(ast) is str: continue else: s, v, c, _base, _begin, _end = ast trimmed_ast = trim_ast(ast) select_item_list = find_child_node(trimmed_ast, "select_item_list") if select_item_list: columns = [] variables = [] index = 0 for node in node_children(select_item_list): if node_symbol(node) == "select_item": index += 1 ident = find_child_node(find_child_node(node, "expr"), "ident") alias = find_child_node(find_child_node(node, "select_alias"), "ident") if not alias: if ident: name = node_value(ident) else: name = "field%i"%index else: name = node_value(alias) columns.append(name) helper = ASTHelper(query) begin, end = helper.get_ast_range(ast) #dump_tree(sys.stdout, ast) query = query[begin:end] offset = begin vars = find_child_nodes(ast, "variable") for var in reversed(vars): begin, end = helper.get_ast_range(var) begin -= offset end -= offset name = query[begin:end] query = query[:begin] + "?" + query[end:] variables.insert(0, name) return query, columns, variables
def _parse_column_name_list_from_query(query): from grt.modules import MysqlSqlFacade ast_list = MysqlSqlFacade.parseAstFromSqlScript(query) for ast in ast_list: if type(ast) is str: continue else: s, v, c, _base, _begin, _end = ast trimmed_ast = trim_ast(ast) select_item_list = find_child_node(trimmed_ast, "select_item_list") if select_item_list: columns = [] variables = [] index = 0 for node in node_children(select_item_list): if node_symbol(node) == "select_item": alias = find_child_node(find_child_node(node, "select_alias"), "ident") if not alias: ident = find_child_node(node, "simple_ident_q") if ident and len(node_children(ident)) == 3: ident = node_children(ident)[-1] else: ident = find_child_node(find_child_node(node, "expr"), "ident") if ident: name = node_value(ident) else: name = "field" field = flatten_node(node) if field: import re m = re.match("([a-zA-Z0-9_]*)", field) if m: name = m.groups()[0] else: name = node_value(alias) columns.append(name) helper = ASTHelper(query) begin, end = helper.get_ast_range(ast) #dump_tree(sys.stdout, ast) query = query[begin:end] offset = begin vars = find_child_nodes(ast, "variable") for var in reversed(vars): begin, end = helper.get_ast_range(var) begin -= offset end -= offset name = query[begin:end] query = query[:begin] + "?" + query[end:] variables.insert(0, name) duplicates = {} for i, c in enumerate(columns): if duplicates.has_key(c): columns[i] = "%s%i" % (c, duplicates[c]) duplicates[c] += 1 duplicates[c] = duplicates.get(c, 0)+1 return query, columns, variables