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

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: ...@@ -29,6 +29,7 @@ env:
before_script: before_script:
# setup docker # setup docker
- "if [ $MARIADB_VER ]; then export MARIADB_ENTRYPOINT=$TRAVIS_BUILD_DIR/test/config/mariadb; fi" - "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 [ $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 [ $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" - "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: ...@@ -56,6 +56,8 @@ services:
MYSQL_DATABASE: sequelize_test MYSQL_DATABASE: sequelize_test
MYSQL_USER: sequelize_test MYSQL_USER: sequelize_test
MYSQL_PASSWORD: sequelize_test MYSQL_PASSWORD: sequelize_test
volumes:
- $MYSQLDB_ENTRYPOINT:/docker-entrypoint-initdb.d
ports: ports:
- "8980:3306" - "8980:3306"
container_name: mysql-57 container_name: mysql-57
...@@ -69,4 +71,3 @@ services: ...@@ -69,4 +71,3 @@ services:
ports: ports:
- "8970:1433" - "8970:1433"
container_name: mssql container_name: mssql
...@@ -24,8 +24,14 @@ class MariaDBQueryGenerator extends MySQLQueryGenerator { ...@@ -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)}`, '') : ''});`; 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() { showTablesQuery(database) {
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\''; 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 { ...@@ -148,8 +148,14 @@ class MySQLQueryGenerator extends AbstractQueryGenerator {
return `SHOW FULL COLUMNS FROM ${table};`; return `SHOW FULL COLUMNS FROM ${table};`;
} }
showTablesQuery() { showTablesQuery(database) {
return "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';"; 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) { addColumnQuery(table, key, dataType) {
......
...@@ -420,7 +420,7 @@ class QueryInterface { ...@@ -420,7 +420,7 @@ class QueryInterface {
type: QueryTypes.SHOWTABLES 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)); 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'), () => { ...@@ -63,6 +63,46 @@ describe(Support.getTestDialectTeaser('QueryInterface'), () => {
expect(tableNames).to.deep.equal(['my_test_table']); 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', () => { describe('renameTable', () => {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!