(tctx *tcontext.Context, conn *BaseConn, meta TableMeta)
| 966 | } |
| 967 | |
| 968 | func selectTiDBTableSample(tctx *tcontext.Context, conn *BaseConn, meta TableMeta) (pkFields []string, pkVals [][]string, err error) { |
| 969 | pkFields, pkColTypes, err := selectTiDBRowKeyFields(tctx, conn, meta, nil) |
| 970 | if err != nil { |
| 971 | return nil, nil, errors.Trace(err) |
| 972 | } |
| 973 | |
| 974 | query := buildTiDBTableSampleQuery(pkFields, meta.DatabaseName(), meta.TableName()) |
| 975 | pkValNum := len(pkFields) |
| 976 | var iter SQLRowIter |
| 977 | rowRec := MakeRowReceiver(pkColTypes) |
| 978 | buf := new(bytes.Buffer) |
| 979 | |
| 980 | err = conn.QuerySQL(tctx, func(rows *sql.Rows) error { |
| 981 | if iter == nil { |
| 982 | iter = &rowIter{ |
| 983 | rows: rows, |
| 984 | args: make([]any, pkValNum), |
| 985 | } |
| 986 | } |
| 987 | err = iter.Decode(rowRec) |
| 988 | if err != nil { |
| 989 | return errors.Trace(err) |
| 990 | } |
| 991 | pkValRow := make([]string, 0, pkValNum) |
| 992 | for _, rec := range rowRec.receivers { |
| 993 | rec.WriteToBuffer(buf, true) |
| 994 | pkValRow = append(pkValRow, buf.String()) |
| 995 | buf.Reset() |
| 996 | } |
| 997 | pkVals = append(pkVals, pkValRow) |
| 998 | return nil |
| 999 | }, func() { |
| 1000 | if iter != nil { |
| 1001 | _ = iter.Close() |
| 1002 | iter = nil |
| 1003 | } |
| 1004 | rowRec = MakeRowReceiver(pkColTypes) |
| 1005 | pkVals = pkVals[:0] |
| 1006 | buf.Reset() |
| 1007 | }, query) |
| 1008 | if err == nil && iter != nil && iter.Error() != nil { |
| 1009 | err = iter.Error() |
| 1010 | } |
| 1011 | |
| 1012 | return pkFields, pkVals, err |
| 1013 | } |
| 1014 | |
| 1015 | func buildTiDBTableSampleQuery(pkFields []string, dbName, tblName string) string { |
| 1016 | template := "SELECT %s FROM `%s`.`%s` TABLESAMPLE REGIONS() ORDER BY %s" |
no test coverage detected