func getInsertPKValues(pkColumnNumbers []int, rowList *Node, tableInfo *schema.Table) (pkValues []interface{}) { pkValues = make([]interface{}, len(pkColumnNumbers)) for index, columnNumber := range pkColumnNumbers { if columnNumber == -1 { pkValues[index] = tableInfo.GetPKColumn(index).Default continue } values := make([]interface{}, rowList.Len()) for j := 0; j < rowList.Len(); j++ { if columnNumber >= rowList.At(j).At(0).Len() { // NODE_LIST->'('->NODE_LIST panic(NewParserError("Column count doesn't match value count")) } node := rowList.At(j).At(0).At(columnNumber) // NODE_LIST->'('->NODE_LIST->Value value := node.execAnalyzeValue() if value == nil { log.Warningf("insert is too complex %v", node) return nil } values[j] = asInterface(value) } if len(values) == 1 { pkValues[index] = values[0] } else { pkValues[index] = values } } return pkValues }
func getInsertPKValues(pkColumnNumbers []int, rowList sqlparser.Values, tableInfo *schema.Table) (pkValues []interface{}, err error) { pkValues = make([]interface{}, len(pkColumnNumbers)) for index, columnNumber := range pkColumnNumbers { if columnNumber == -1 { pkValues[index] = tableInfo.GetPKColumn(index).Default continue } values := make([]interface{}, len(rowList)) for j := 0; j < len(rowList); j++ { if _, ok := rowList[j].(*sqlparser.Subquery); ok { return nil, errors.New("row subquery not supported for inserts") } row := rowList[j].(sqlparser.ValTuple) if columnNumber >= len(row) { return nil, errors.New("column count doesn't match value count") } node := row[columnNumber] if !sqlparser.IsNull(node) && !sqlparser.IsValue(node) { return nil, nil } var err error values[j], err = sqlparser.AsInterface(node) if err != nil { return nil, err } } if len(values) == 1 { pkValues[index] = values[0] } else { pkValues[index] = values } } return pkValues, nil }