From 9a9b18a3efe40e661767b0a30eef38c21b5ce77d Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Wed, 2 Apr 2025 09:48:35 +0200 Subject: [PATCH] clickhouse: load views for users with limited permissions #1076 --- packages/tools/src/DatabaseAnalyser.ts | 1 + plugins/dbgate-plugin-clickhouse/src/backend/Analyser.js | 7 +++++-- plugins/dbgate-plugin-clickhouse/src/backend/sql/index.js | 2 ++ .../src/backend/sql/viewsNoDefinition.js | 8 ++++++++ 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 plugins/dbgate-plugin-clickhouse/src/backend/sql/viewsNoDefinition.js diff --git a/packages/tools/src/DatabaseAnalyser.ts b/packages/tools/src/DatabaseAnalyser.ts index 31c86d93a..0ebb69472 100644 --- a/packages/tools/src/DatabaseAnalyser.ts +++ b/packages/tools/src/DatabaseAnalyser.ts @@ -354,6 +354,7 @@ export class DatabaseAnalyser { logger.error(extractErrorLogData(err, { template }), 'Error running analyser query'); return { rows: [], + isError: true, }; } } diff --git a/plugins/dbgate-plugin-clickhouse/src/backend/Analyser.js b/plugins/dbgate-plugin-clickhouse/src/backend/Analyser.js index 774784494..08bd453f8 100644 --- a/plugins/dbgate-plugin-clickhouse/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-clickhouse/src/backend/Analyser.js @@ -34,7 +34,10 @@ class Analyser extends DatabaseAnalyser { this.feedback({ analysingMessage: 'Loading columns' }); const columns = await this.analyserQuery('columns', ['tables', 'views']); this.feedback({ analysingMessage: 'Loading views' }); - const views = await this.analyserQuery('views', ['views']); + let views = await this.analyserQuery('views', ['views']); + if (views?.isError) { + views = await this.analyserQuery('viewsNoDefinition', ['views']); + } const res = { tables: tables.rows.map((table) => ({ @@ -64,7 +67,7 @@ class Analyser extends DatabaseAnalyser { ...col, ...extractDataType(col.dataType), })), - createSql: `CREATE VIEW "${view.pureName}"\nAS\n${view.viewDefinition}`, + createSql: view.viewDefinition ? `CREATE VIEW "${view.pureName}"\nAS\n${view.viewDefinition}` : '', })), }; this.feedback({ analysingMessage: null }); diff --git a/plugins/dbgate-plugin-clickhouse/src/backend/sql/index.js b/plugins/dbgate-plugin-clickhouse/src/backend/sql/index.js index 6465f821b..1a5545817 100644 --- a/plugins/dbgate-plugin-clickhouse/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-clickhouse/src/backend/sql/index.js @@ -1,11 +1,13 @@ const columns = require('./columns'); const tables = require('./tables'); const views = require('./views'); +const viewsNoDefinition = require('./viewsNoDefinition'); const tableModifications = require('./tableModifications'); module.exports = { columns, tables, views, + viewsNoDefinition, tableModifications, }; diff --git a/plugins/dbgate-plugin-clickhouse/src/backend/sql/viewsNoDefinition.js b/plugins/dbgate-plugin-clickhouse/src/backend/sql/viewsNoDefinition.js new file mode 100644 index 000000000..9d3706822 --- /dev/null +++ b/plugins/dbgate-plugin-clickhouse/src/backend/sql/viewsNoDefinition.js @@ -0,0 +1,8 @@ +module.exports = ` +select + tables.name as "pureName", + tables.uuid as "objectId", + tables.metadata_modification_time as "contentHash" +from system.tables +where tables.database='#DATABASE#' and tables.uuid =OBJECT_ID_CONDITION and tables.engine = 'View' +`;