diff --git a/.github/workflows/build-app-beta.yaml b/.github/workflows/build-app-beta.yaml index 13706513..5674fd5b 100644 --- a/.github/workflows/build-app-beta.yaml +++ b/.github/workflows/build-app-beta.yaml @@ -1,4 +1,4 @@ -name: Electron app +name: Electron app BETA on: push: diff --git a/.github/workflows/build-docker-beta.yaml b/.github/workflows/build-docker-beta.yaml index 3b454331..4801df4c 100644 --- a/.github/workflows/build-docker-beta.yaml +++ b/.github/workflows/build-docker-beta.yaml @@ -1,4 +1,4 @@ -name: Docker image +name: Docker image BETA # on: [push] diff --git a/integration-tests/__tests__/object-analyse.spec.js b/integration-tests/__tests__/object-analyse.spec.js index caf3bb8e..ef3d0dee 100644 --- a/integration-tests/__tests__/object-analyse.spec.js +++ b/integration-tests/__tests__/object-analyse.spec.js @@ -16,7 +16,7 @@ const obj1Match = expect.objectContaining({ describe('Object analyse', () => { test.each(flatSource())( - 'Full analysis (%s - %s)', + 'Full analysis - %s - %s', testWrapper(async (conn, driver, type, object, engine) => { for (const sql of initSql) await driver.query(conn, sql); @@ -29,7 +29,7 @@ describe('Object analyse', () => { ); test.each(flatSource())( - 'Incremental analysis - add (%s - %s)', + 'Incremental analysis - add - %s - %s', testWrapper(async (conn, driver, type, object, engine) => { for (const sql of initSql) await driver.query(conn, sql); @@ -44,7 +44,7 @@ describe('Object analyse', () => { ); test.each(flatSource())( - 'Incremental analysis - drop (%s - %s)', + 'Incremental analysis - drop - %s - %s', testWrapper(async (conn, driver, type, object, engine) => { for (const sql of initSql) await driver.query(conn, sql); @@ -58,4 +58,25 @@ describe('Object analyse', () => { expect(structure2[type][0]).toEqual(obj1Match); }) ); + + test.each(flatSource())( + 'Create SQL - add - %s - %s', + testWrapper(async (conn, driver, type, object, engine) => { + for (const sql of initSql) await driver.query(conn, sql); + + await driver.query(conn, object.create1); + const structure1 = await driver.analyseFull(conn); + await driver.query(conn, object.drop1); + const structure2 = await driver.analyseIncremental(conn, structure1); + expect(structure2[type].length).toEqual(0); + + await driver.query(conn, structure1[type][0].createSql); + + const structure3 = await driver.analyseIncremental(conn, structure2); + + expect(structure3[type].length).toEqual(1); + expect(structure3[type][0]).toEqual(obj1Match); + }) + ); + }); diff --git a/integration-tests/__tests__/table-analyse.spec.js b/integration-tests/__tests__/table-analyse.spec.js index f460a5ed..a9f54d48 100644 --- a/integration-tests/__tests__/table-analyse.spec.js +++ b/integration-tests/__tests__/table-analyse.spec.js @@ -27,7 +27,7 @@ const t1Match = expect.objectContaining({ describe('Table analyse', () => { test.each(engines.map(engine => [engine.label, engine]))( - 'Table structure - full analysis (%s)', + 'Table structure - full analysis - %s', testWrapper(async (conn, driver, engine) => { await driver.query(conn, t1Sql); @@ -39,7 +39,7 @@ describe('Table analyse', () => { ); test.each(engines.map(engine => [engine.label, engine]))( - 'Table add - incremental analysis (%s)', + 'Table add - incremental analysis - %s', testWrapper(async (conn, driver, engine) => { await driver.query(conn, 'CREATE TABLE t0 (id0 int)'); const structure1 = await driver.analyseFull(conn); @@ -52,7 +52,7 @@ describe('Table analyse', () => { ); test.each(engines.map(engine => [engine.label, engine]))( - 'Table remove - incremental analysis (%s)', + 'Table remove - incremental analysis - %s', testWrapper(async (conn, driver, engine) => { await driver.query(conn, t1Sql); await driver.query(conn, 'CREATE TABLE t2 (id2 int)'); diff --git a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js index d74d07bc..ae20f14a 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js @@ -114,6 +114,7 @@ class Analyser extends DatabaseAnalyser { objectId: `procedures:${proc.schema_name}.${proc.pure_name}`, pureName: proc.pure_name, schemaName: proc.schema_name, + createSql: `CREATE PROCEDURE "${proc.schema_name}"."${proc.pure_name}"() LANGUAGE ${proc.language}\nAS\n$$\n${proc.definition}\n$$`, contentHash: proc.hash_code, })), functions: routines.rows diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/routines.js b/plugins/dbgate-plugin-postgres/src/backend/sql/routines.js index b4c1a830..c78fa26c 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/routines.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/routines.js @@ -2,9 +2,10 @@ module.exports = ` select routine_name as "pure_name", routine_schema as "schema_name", - routine_definition as "create_sql", + routine_definition as "definition", md5(routine_definition) as "hash_code", - routine_type as "object_type" + routine_type as "object_type", + external_language as "language" from information_schema.routines where routine_schema != 'information_schema' and routine_schema != 'pg_catalog' and (