func (isp *InfoSchemaPlan) doColumns(schemas []*model.DBInfo, iterFunc plan.RowIterFunc) error { for _, schema := range schemas { for _, table := range schema.Tables { for i, col := range table.Columns { colLen := col.Flen if colLen == types.UnspecifiedLength { colLen = mysql.GetDefaultFieldLength(col.Tp) } decimal := col.Decimal if decimal == types.UnspecifiedLength { decimal = 0 } dataType := types.TypeToStr(col.Tp, col.Charset == charset.CharsetBin) columnType := fmt.Sprintf("%s(%d)", dataType, colLen) columnDesc := column.NewColDesc(&column.Col{ColumnInfo: *col}) var columnDefault interface{} if columnDesc.DefaultValue != nil { columnDefault = fmt.Sprintf("%v", columnDesc.DefaultValue) } record := []interface{}{ catalogVal, // TABLE_CATALOG schema.Name.O, // TABLE_SCHEMA table.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 == charset.CharsetBin), // 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 } if more, err := iterFunc(0, record); !more || err != nil { return err } } } } return nil }
// String implements fmt.Stringer interface. func (c *Column) String() string { ans := []string{c.Name.O, types.TypeToStr(c.Tp, c.Charset)} if mysql.HasAutoIncrementFlag(c.Flag) { ans = append(ans, "AUTO_INCREMENT") } if mysql.HasNotNullFlag(c.Flag) { ans = append(ans, "NOT NULL") } return strings.Join(ans, " ") }
func (isp *InfoSchemaPlan) fetchColumns(schemas []*model.DBInfo) { for _, schema := range schemas { for _, table := range schema.Tables { for i, col := range table.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 := column.NewColDesc(&column.Col{ColumnInfo: *col}) var columnDefault interface{} if columnDesc.DefaultValue != nil { columnDefault = fmt.Sprintf("%v", columnDesc.DefaultValue) } record := []interface{}{ catalogVal, // TABLE_CATALOG schema.Name.O, // TABLE_SCHEMA table.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 } isp.rows = append(isp.rows, &plan.Row{Data: record}) } } } }
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 }