// parsePkTuple parese one pk tuple. func parsePkTuple(tokenizer *sqlparser.Tokenizer) (tuple sqlparser.ValTuple, err error) { // start scanning the list for typ, val := tokenizer.Scan(); typ != ')'; typ, val = tokenizer.Scan() { switch typ { case '-': // handle negative numbers typ2, val2 := tokenizer.Scan() if typ2 != sqlparser.NUMBER { return nil, fmt.Errorf("expecing number after '-'") } num := append(sqlparser.NumVal("-"), val2...) tuple = append(tuple, num) case sqlparser.NUMBER: tuple = append(tuple, sqlparser.NumVal(val)) case sqlparser.NULL: tuple = append(tuple, new(sqlparser.NullVal)) case sqlparser.STRING: decoded := make([]byte, base64.StdEncoding.DecodedLen(len(val))) numDecoded, err := base64.StdEncoding.Decode(decoded, val) if err != nil { return nil, err } tuple = append(tuple, sqlparser.StrVal(decoded[:numDecoded])) default: return nil, fmt.Errorf("syntax error at position: %d", tokenizer.Position) } } return tuple, nil }
func parsePkNames(tokenizer *sqlparser.Tokenizer) (columns []string, err error) { if typ, _ := tokenizer.Scan(); typ != '(' { return nil, fmt.Errorf("expecting '('") } for typ, val := tokenizer.Scan(); typ != ')'; typ, val = tokenizer.Scan() { switch typ { case sqlparser.ID: columns = append(columns, string(val)) default: return nil, fmt.Errorf("syntax error at position: %d", tokenizer.Position) } } return columns, nil }