func NormalizeNode(node *sqlparser.Node, bindVars map[string]interface{}, counter *int) { for i := 0; i < node.Len(); i++ { switch node.At(i).Type { case sqlparser.STRING: *counter++ bindVars[fmt.Sprintf("v%d", *counter)] = string(node.At(i).Value) node.Set(i, newArgumentNode(counter)) case sqlparser.NUMBER: *counter++ varname := fmt.Sprintf("v%d", *counter) valstr := string(node.At(i).Value) if ival, err := strconv.ParseInt(valstr, 0, 64); err == nil { bindVars[varname] = ival } else if uval, err := strconv.ParseUint(valstr, 0, 64); err == nil { bindVars[varname] = uval } else if fval, err := strconv.ParseFloat(valstr, 64); err == nil { bindVars[varname] = fval } else { panic(sqlparser.NewParserError("%v", err)) } node.Set(i, newArgumentNode(counter)) default: for i := 0; i < node.Len(); i++ { NormalizeNode(node.At(i), bindVars, counter) } } } }