Skip to content

Commit 0b58466

Browse files
authored
mssql QoL changes and a major bug fix (#1399)
* Make database optional * Use database specific information_schema This fixes an issue with sidebar where users can't see database tables/views * Return empty list when schema isn't accessible This resolves 'sqltools.getChildrenForTreeItem' failed error when clicking on an inaccessible schema.
1 parent 114957f commit 0b58466

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
lines changed

packages/driver.mssql/connection.schema.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@
121121
"required": [
122122
"server",
123123
"port",
124-
"database",
125124
"username"
126125
]
127126
},
@@ -149,7 +148,6 @@
149148
},
150149
"required": [
151150
"socketPath",
152-
"database",
153151
"username"
154152
]
155153
},

packages/driver.mssql/src/ls/driver.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,15 @@ export default class MSSQL extends AbstractDriver<MSSQLLib.ConnectionPool, any>
157157
private async getChildrenForGroup({ parent, item }: Arg0<IConnectionDriver['getChildrenForItem']>) {
158158
switch (item.childType) {
159159
case ContextValue.SCHEMA:
160-
return this.queryResults(this.queries.fetchSchemas(parent as NSDatabase.IDatabase));
160+
try {
161+
const result = await this.queryResults(
162+
this.queries.fetchSchemas(parent as NSDatabase.IDatabase)
163+
);
164+
return result;
165+
} catch (error) {
166+
this.close();
167+
return [];
168+
}
161169
case ContextValue.TABLE:
162170
return this.queryResults(this.queries.fetchTables(parent as NSDatabase.ISchema));
163171
case ContextValue.VIEW:

packages/driver.mssql/src/ls/queries.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,20 @@ SELECT
3434
(CASE WHEN LOWER(TC.CONSTRAINT_TYPE) = 'primary key' THEN 1 ELSE 0 END) as "isPk",
3535
(CASE WHEN LOWER(TC.CONSTRAINT_TYPE) = 'foreign key' THEN 1 ELSE 0 END) as "isFk"
3636
FROM
37-
INFORMATION_SCHEMA.COLUMNS C
38-
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU ON (
37+
${p => p.database ? `${escapeTableName({ database: p.database, schema: "INFORMATION_SCHEMA", label: "COLUMNS" })}` : 'INFORMATION_SCHEMA.COLUMNS'} C
38+
LEFT JOIN ${p => p.database ? `${escapeTableName({ database: p.database, schema: "INFORMATION_SCHEMA", label: "KEY_COLUMN_USAGE" })}` : 'INFORMATION_SCHEMA.KEY_COLUMN_USAGE'} AS KCU ON (
3939
C.TABLE_CATALOG = KCU.TABLE_CATALOG
4040
AND C.TABLE_NAME = KCU.TABLE_NAME
4141
AND C.TABLE_SCHEMA = KCU.TABLE_SCHEMA
4242
AND C.TABLE_CATALOG = KCU.TABLE_CATALOG
4343
AND C.COLUMN_NAME = KCU.COLUMN_NAME
4444
)
45-
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON (
45+
LEFT JOIN ${p => p.database ? `${escapeTableName({ database: p.database, schema: "INFORMATION_SCHEMA", label: "TABLE_CONSTRAINTS" })}` : 'INFORMATION_SCHEMA.TABLE_CONSTRAINTS'} AS TC ON (
4646
TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
4747
AND TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA
4848
AND TC.TABLE_CATALOG = KCU.TABLE_CATALOG
4949
)
50-
JOIN INFORMATION_SCHEMA.TABLES AS T ON C.TABLE_NAME = T.TABLE_NAME
50+
JOIN ${p => p.database ? `${escapeTableName({ database: p.database, schema: "INFORMATION_SCHEMA", label: "TABLES" })}` : 'INFORMATION_SCHEMA.TABLES'} AS T ON C.TABLE_NAME = T.TABLE_NAME
5151
AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
5252
AND C.TABLE_CATALOG = T.TABLE_CATALOG
5353
WHERE
@@ -79,7 +79,7 @@ SELECT
7979
T.TABLE_SCHEMA AS "schema",
8080
T.TABLE_CATALOG AS "database",
8181
CONVERT(BIT, CASE WHEN T.TABLE_TYPE = 'BASE TABLE' THEN 0 ELSE 1 END) AS "isView"
82-
FROM INFORMATION_SCHEMA.TABLES AS T
82+
FROM ${p => p.database ? `${escapeTableName({ database: p.database, schema: "INFORMATION_SCHEMA", label: "TABLES" })}` : 'INFORMATION_SCHEMA.TABLES'} AS T
8383
WHERE
8484
T.TABLE_SCHEMA = '${p => p.schema}'
8585
AND T.TABLE_CATALOG = '${p => p.database}'
@@ -98,7 +98,7 @@ SELECT
9898
'${ContextValue.SCHEMA}' as "type",
9999
'group-by-ref-type' as "iconId",
100100
catalog_name as "database"
101-
FROM information_schema.schemata
101+
FROM ${p => p.database ? `${escapeTableName({ database: p.database, schema: "information_schema", label: "schemata" })}` : 'information_schema.schemata'}
102102
WHERE
103103
LOWER(schema_name) NOT IN ('information_schema', 'sys', 'guest')
104104
AND LOWER(schema_name) NOT LIKE 'db\\_%' ESCAPE '\\'
@@ -123,7 +123,7 @@ SELECT
123123
(CASE WHEN T.TABLE_TYPE = 'BASE TABLE' THEN 0 ELSE 1 END) AS "isView",
124124
(CASE WHEN T.TABLE_TYPE = 'BASE TABLE' THEN 'table' ELSE 'view' END) AS description,
125125
('[' + T.TABLE_CATALOG + '].[' + T.TABLE_SCHEMA + '].[' + T.TABLE_NAME + ']') as detail
126-
FROM INFORMATION_SCHEMA.TABLES AS T
126+
FROM ${p => p.database ? `${escapeTableName({ database: p.database, schema: "INFORMATION_SCHEMA", label: "TABLES" })}` : 'INFORMATION_SCHEMA.TABLES'} AS T
127127
WHERE
128128
LOWER(T.TABLE_SCHEMA) NOT IN ('information_schema', 'sys', 'guest')
129129
AND LOWER(T.TABLE_SCHEMA) NOT LIKE 'db\\_%' ESCAPE '\\'
@@ -152,20 +152,20 @@ SELECT
152152
(CASE WHEN LOWER(TC.CONSTRAINT_TYPE) = 'primary key' THEN 1 ELSE 0 END) as "isPk",
153153
(CASE WHEN LOWER(TC.CONSTRAINT_TYPE) = 'foreign key' THEN 1 ELSE 0 END) as "isFk"
154154
FROM
155-
INFORMATION_SCHEMA.COLUMNS C
156-
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU ON (
155+
${p => p.tables[0].database ? `${escapeTableName({ database: p.tables[0].database, schema: "INFORMATION_SCHEMA", label: "COLUMNS" })}` : 'INFORMATION_SCHEMA.COLUMNS'} C
156+
LEFT JOIN ${p => p.tables[0].database ? `${escapeTableName({ database: p.tables[0].database, schema: "INFORMATION_SCHEMA", label: "KEY_COLUMN_USAGE" })}` : 'INFORMATION_SCHEMA.KEY_COLUMN_USAGE'} AS KCU ON (
157157
C.TABLE_CATALOG = KCU.TABLE_CATALOG
158158
AND C.TABLE_NAME = KCU.TABLE_NAME
159159
AND C.TABLE_SCHEMA = KCU.TABLE_SCHEMA
160160
AND C.TABLE_CATALOG = KCU.TABLE_CATALOG
161161
AND C.COLUMN_NAME = KCU.COLUMN_NAME
162162
)
163-
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON (
163+
LEFT JOIN ${p => p.tables[0].database ? `${escapeTableName({ database: p.tables[0].database, schema: "INFORMATION_SCHEMA", label: "TABLE_CONSTRAINTS" })}` : 'INFORMATION_SCHEMA.TABLE_CONSTRAINTS'} AS TC ON (
164164
TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
165165
AND TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA
166166
AND TC.TABLE_CATALOG = KCU.TABLE_CATALOG
167167
)
168-
JOIN INFORMATION_SCHEMA.TABLES AS T ON C.TABLE_NAME = T.TABLE_NAME
168+
JOIN ${p => p.tables[0].database ? `${escapeTableName({ database: p.tables[0].database, schema: "INFORMATION_SCHEMA", label: "TABLES" })}` : 'INFORMATION_SCHEMA.TABLES'} AS T ON C.TABLE_NAME = T.TABLE_NAME
169169
AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
170170
AND C.TABLE_CATALOG = T.TABLE_CATALOG
171171
WHERE LOWER(C.TABLE_SCHEMA) NOT IN ('information_schema', 'sys', 'guest')

0 commit comments

Comments
 (0)