getTables gets all tables of a database using the provided database instance.
(db *sql.DB, dbName string, dbType storepb.Engine)
| 281 | |
| 282 | // getTables gets all tables of a database using the provided database instance. |
| 283 | func getTables(db *sql.DB, dbName string, dbType storepb.Engine) ([]*TableSchema, error) { |
| 284 | var tables []*TableSchema |
| 285 | query := "SELECT TABLE_NAME, TABLE_TYPE FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?" |
| 286 | rows, err := db.Query(query, dbName) |
| 287 | if err != nil { |
| 288 | return nil, err |
| 289 | } |
| 290 | defer rows.Close() |
| 291 | |
| 292 | columns, err := rows.Columns() |
| 293 | if err != nil { |
| 294 | return nil, err |
| 295 | } |
| 296 | for rows.Next() { |
| 297 | var tbl TableSchema |
| 298 | // StorageFormat is the third but unused column for Doris. |
| 299 | var unusedStorageFormat string |
| 300 | if len(columns) == 3 { |
| 301 | // Doris. |
| 302 | if err := rows.Scan(&tbl.Name, &tbl.TableType, &unusedStorageFormat); err != nil { |
| 303 | return nil, err |
| 304 | } |
| 305 | } else { |
| 306 | if err := rows.Scan(&tbl.Name, &tbl.TableType); err != nil { |
| 307 | return nil, err |
| 308 | } |
| 309 | } |
| 310 | tables = append(tables, &tbl) |
| 311 | } |
| 312 | if err := rows.Err(); err != nil { |
| 313 | return nil, err |
| 314 | } |
| 315 | |
| 316 | // Materialized views need a separate catalog lookup and re-tagging so the dump emits |
| 317 | // SHOW CREATE MATERIALIZED VIEW for them (Doris reports them as BASE TABLE, StarRocks as VIEW). |
| 318 | materializedViewNames, err := getMaterializedViewNames(db, dbName, dbType) |
| 319 | if err != nil { |
| 320 | return nil, err |
| 321 | } |
| 322 | markMaterializedViews(tables, materializedViewNames) |
| 323 | |
| 324 | var result []*TableSchema |
| 325 | for _, tbl := range tables { |
| 326 | stmt, err := getTableStmt(db, dbName, tbl.Name, tbl.TableType) |
| 327 | if err != nil { |
| 328 | // Skip tables that were dropped between listing and fetching CREATE statement. |
| 329 | var mysqlErr *mysql.MySQLError |
| 330 | if errors.As(err, &mysqlErr) && mysqlErr.Number == errUnknownTable { |
| 331 | slog.Debug("table was dropped during dump, skipping", |
| 332 | slog.String("database", dbName), |
| 333 | slog.String("table", tbl.Name)) |
| 334 | continue |
| 335 | } |
| 336 | return nil, errors.Wrapf(err, "failed to call getTableStmt(%q, %q, %q)", dbName, tbl.Name, tbl.TableType) |
| 337 | } |
| 338 | tbl.Statement = stmt |
| 339 | if tbl.TableType == viewTableType || tbl.TableType == materializedViewType { |
| 340 | viewColumns, err := getViewColumns(db, dbName, tbl.Name) |
no test coverage detected