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.Column{ColumnInfo: *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, // CHARACTOR_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 *ShowExec) fetchShowColumns() error { tb, err := e.getTable() if err != nil { return errors.Trace(err) } cols := tb.Cols() for _, col := range cols { if e.Column != nil && e.Column.Name.L != col.Name.L { continue } desc := table.NewColDesc(col) // The FULL keyword causes the output to include the column collation and comments, // as well as the privileges you have for each column. row := &Row{} if e.Full { row.Data = types.MakeDatums( desc.Field, desc.Type, desc.Collation, desc.Null, desc.Key, desc.DefaultValue, desc.Extra, desc.Privileges, desc.Comment, ) } else { row.Data = types.MakeDatums( desc.Field, desc.Type, desc.Null, desc.Key, desc.DefaultValue, desc.Extra, ) } e.rows = append(e.rows, row) } return nil }