// TableFromMeta creates a Table instance from model.TableInfo. func TableFromMeta(alloc autoid.Allocator, tblInfo *model.TableInfo) (table.Table, error) { if tblInfo.State == model.StateNone { return nil, table.ErrTableStateCantNone.Gen("table %s can't be in none state", tblInfo.Name) } columns := make([]*table.Column, 0, len(tblInfo.Columns)) for _, colInfo := range tblInfo.Columns { if colInfo.State == model.StateNone { return nil, table.ErrColumnStateCantNone.Gen("column %s can't be in none state", colInfo.Name) } col := table.ToColumn(colInfo) columns = append(columns, col) } t := newTable(tblInfo.ID, columns, alloc) for _, idxInfo := range tblInfo.Indices { if idxInfo.State == model.StateNone { return nil, table.ErrIndexStateCantNone.Gen("index %s can't be in none state", idxInfo.Name) } idx := NewIndex(tblInfo, idxInfo) t.indices = append(t.indices, idx) } t.meta = tblInfo return t, nil }
// BoundedTableFromMeta creates a Table instance from model.TableInfo. func BoundedTableFromMeta(alloc autoid.Allocator, tblInfo *model.TableInfo, capacity int64) table.Table { columns := make([]*table.Column, 0, len(tblInfo.Columns)) var pkHandleColumn *table.Column for _, colInfo := range tblInfo.Columns { col := table.ToColumn(colInfo) columns = append(columns, col) if col.IsPKHandleColumn(tblInfo) { pkHandleColumn = col } } t := newBoundedTable(tblInfo.ID, tblInfo.Name.O, columns, alloc, capacity) t.pkHandleCol = pkHandleColumn t.meta = tblInfo return t }
// MemoryTableFromMeta creates a Table instance from model.TableInfo. func MemoryTableFromMeta(alloc autoid.Allocator, tblInfo *model.TableInfo) (table.Table, error) { columns := make([]*table.Column, 0, len(tblInfo.Columns)) var pkHandleColumn *table.Column for _, colInfo := range tblInfo.Columns { col := table.ToColumn(colInfo) columns = append(columns, col) if col.IsPKHandleColumn(tblInfo) { pkHandleColumn = col } } t := newMemoryTable(tblInfo.ID, tblInfo.Name.O, columns, alloc) t.pkHandleCol = pkHandleColumn t.meta = tblInfo return t, nil }
func dataForColumnsInTable(schema *model.DBInfo, tbl *model.TableInfo) [][]types.Datum { rows := [][]types.Datum{} for i, col := range tbl.Columns { colLen := col.Flen if colLen == types.UnspecifiedLength { colLen = mysql.GetDefaultFieldLength(col.Tp) } decimal := col.Decimal if decimal == types.UnspecifiedLength { decimal = 0 } columnType := col.FieldType.CompactStr() columnDesc := table.NewColDesc(table.ToColumn(col)) var columnDefault interface{} if columnDesc.DefaultValue != nil { columnDefault = fmt.Sprintf("%v", columnDesc.DefaultValue) } record := types.MakeDatums( catalogVal, // TABLE_CATALOG schema.Name.O, // TABLE_SCHEMA tbl.Name.O, // TABLE_NAME col.Name.O, // COLUMN_NAME i+1, // ORIGINAL_POSITION columnDefault, // COLUMN_DEFAULT columnDesc.Null, // IS_NULLABLE types.TypeToStr(col.Tp, col.Charset), // DATA_TYPE colLen, // CHARACTER_MAXIMUM_LENGTH colLen, // CHARACTER_OCTET_LENGTH decimal, // NUMERIC_PRECISION 0, // NUMERIC_SCALE 0, // DATETIME_PRECISION col.Charset, // CHARACTER_SET_NAME col.Collate, // COLLATION_NAME columnType, // COLUMN_TYPE columnDesc.Key, // COLUMN_KEY columnDesc.Extra, // EXTRA "select,insert,update,references", // PRIVILEGES "", // COLUMN_COMMENT ) rows = append(rows, record) } return rows }
func (e *XSelectIndexExec) indexRowToTableRow(handle int64, indexRow []types.Datum) []types.Datum { tableRow := make([]types.Datum, len(e.indexPlan.Columns)) for i, tblCol := range e.indexPlan.Columns { if table.ToColumn(tblCol).IsPKHandleColumn(e.indexPlan.Table) { if mysql.HasUnsignedFlag(tblCol.FieldType.Flag) { tableRow[i] = types.NewUintDatum(uint64(handle)) } else { tableRow[i] = types.NewIntDatum(handle) } continue } for j, idxCol := range e.indexPlan.Index.Columns { if tblCol.Name.L == idxCol.Name.L { tableRow[i] = indexRow[j] break } } } return tableRow }
func (e *TableScanExec) nextForInfoSchema() (*Row, error) { if e.infoSchemaRows == nil { columns := make([]*table.Column, len(e.schema)) for i, v := range e.columns { columns[i] = table.ToColumn(v) } err := e.t.IterRecords(e.ctx, nil, columns, func(h int64, rec []types.Datum, cols []*table.Column) (bool, error) { e.infoSchemaRows = append(e.infoSchemaRows, rec) return true, nil }) if err != nil { return nil, errors.Trace(err) } } if e.infoSchemaCursor >= len(e.infoSchemaRows) { return nil, nil } row := &Row{Data: e.infoSchemaRows[e.infoSchemaCursor]} e.infoSchemaCursor++ return row, nil }
func (e *TableScanExec) getRow(handle int64) (*Row, error) { row := &Row{} var err error columns := make([]*table.Column, len(e.schema)) for i, v := range e.columns { columns[i] = table.ToColumn(v) } row.Data, err = e.t.RowWithCols(e.ctx, handle, columns) if err != nil { return nil, errors.Trace(err) } // Put rowKey to the tail of record row. rke := &RowKeyEntry{ Tbl: e.t, Handle: handle, TableAsName: e.asName, } row.RowKeys = append(row.RowKeys, rke) return row, nil }