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)
			}
		}
	}
}