不要怂,就是干,撸起袖子干!

Commit c7138f5a by Tony Brix Committed by Sushant

fix(mysql/showAllTables): list tables from current database (#11456)

1 parent d064073b
......@@ -29,6 +29,7 @@ env:
before_script:
# setup docker
- "if [ $MARIADB_VER ]; then export MARIADB_ENTRYPOINT=$TRAVIS_BUILD_DIR/test/config/mariadb; fi"
- "if [ $MYSQL_VER ]; then export MYSQLDB_ENTRYPOINT=$TRAVIS_BUILD_DIR/test/config/mysql; fi"
- "if [ $POSTGRES_VER ] || [ $MARIADB_VER ] || [ $MYSQL_VER ]; then docker-compose up -d ${POSTGRES_VER} ${MARIADB_VER} ${MYSQL_VER}; fi"
- "if [ $MARIADB_VER ]; then docker run --link ${MARIADB_VER}:db -e CHECK_PORT=3306 -e CHECK_HOST=db --net sequelize_default giorgos/takis; fi"
- "if [ $MYSQL_VER ]; then docker run --link ${MYSQL_VER}:db -e CHECK_PORT=3306 -e CHECK_HOST=db --net sequelize_default giorgos/takis; fi"
......
......@@ -56,6 +56,8 @@ services:
MYSQL_DATABASE: sequelize_test
MYSQL_USER: sequelize_test
MYSQL_PASSWORD: sequelize_test
volumes:
- $MYSQLDB_ENTRYPOINT:/docker-entrypoint-initdb.d
ports:
- "8980:3306"
container_name: mysql-57
......@@ -69,4 +71,3 @@ services:
ports:
- "8970:1433"
container_name: mssql
......@@ -24,8 +24,14 @@ class MariaDBQueryGenerator extends MySQLQueryGenerator {
return `SELECT SCHEMA_NAME as schema_name FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('MYSQL', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA'${skip ? skip.reduce( (sql, schemaName) => sql += `,${this.escape(schemaName)}`, '') : ''});`;
}
showTablesQuery() {
return 'SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN (\'MYSQL\', \'INFORMATION_SCHEMA\', \'PERFORMANCE_SCHEMA\') AND TABLE_TYPE = \'BASE TABLE\'';
showTablesQuery(database) {
let query = 'SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = \'BASE TABLE\'';
if (database) {
query += ` AND TABLE_SCHEMA = ${this.escape(database)}`;
} else {
query += ' AND TABLE_SCHEMA NOT IN (\'MYSQL\', \'INFORMATION_SCHEMA\', \'PERFORMANCE_SCHEMA\')';
}
return `${query};`;
}
}
......
......@@ -148,8 +148,14 @@ class MySQLQueryGenerator extends AbstractQueryGenerator {
return `SHOW FULL COLUMNS FROM ${table};`;
}
showTablesQuery() {
return "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';";
showTablesQuery(database) {
let query = 'SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = \'BASE TABLE\'';
if (database) {
query += ` AND TABLE_SCHEMA = ${this.escape(database)}`;
} else {
query += ' AND TABLE_SCHEMA NOT IN (\'MYSQL\', \'INFORMATION_SCHEMA\', \'PERFORMANCE_SCHEMA\', \'SYS\')';
}
return `${query};`;
}
addColumnQuery(table, key, dataType) {
......
......@@ -420,7 +420,7 @@ class QueryInterface {
type: QueryTypes.SHOWTABLES
});
const showTablesSql = this.QueryGenerator.showTablesQuery();
const showTablesSql = this.QueryGenerator.showTablesQuery(this.sequelize.config.database);
return this.sequelize.query(showTablesSql, options).then(tableNames => _.flatten(tableNames));
}
......
GRANT ALL ON *.* TO 'sequelize_test'@'%' with grant option;
FLUSH PRIVILEGES;
......@@ -63,6 +63,46 @@ describe(Support.getTestDialectTeaser('QueryInterface'), () => {
expect(tableNames).to.deep.equal(['my_test_table']);
});
});
if (dialect !== 'sqlite' && dialect !== 'postgres') {
// NOTE: sqlite doesn't allow querying between databases and
// postgres requires creating a new connection to create a new table.
it('should not show tables in other databases', function() {
return this.queryInterface
.createTable('my_test_table1', { name: DataTypes.STRING })
.then(() => this.sequelize.query('CREATE DATABASE my_test_db'))
.then(() => this.sequelize.query(`CREATE TABLE my_test_db${dialect === 'mssql' ? '.dbo' : ''}.my_test_table2 (id INT)`))
.then(() => this.queryInterface.showAllTables())
.tap(() => this.sequelize.query('DROP DATABASE my_test_db'))
.then(tableNames => {
if (tableNames[0] && tableNames[0].tableName) {
tableNames = tableNames.map(v => v.tableName);
}
expect(tableNames).to.deep.equal(['my_test_table1']);
});
});
if (dialect === 'mysql' || dialect === 'mariadb') {
it('should show all tables in all databases', function() {
return this.queryInterface
.createTable('my_test_table1', { name: DataTypes.STRING })
.then(() => this.sequelize.query('CREATE DATABASE my_test_db'))
.then(() => this.sequelize.query('CREATE TABLE my_test_db.my_test_table2 (id INT)'))
.then(() => this.sequelize.query(this.queryInterface.QueryGenerator.showTablesQuery(), {
raw: true,
type: this.sequelize.QueryTypes.SHOWTABLES
}))
.tap(() => this.sequelize.query('DROP DATABASE my_test_db'))
.then(tableNames => {
if (tableNames[0] && tableNames[0].tableName) {
tableNames = tableNames.map(v => v.tableName);
}
tableNames.sort();
expect(tableNames).to.deep.equal(['my_test_table1', 'my_test_table2']);
});
});
}
}
});
describe('renameTable', () => {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!