diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 95cf19fc6..ad1155258 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -401,14 +401,18 @@ async function handleExecuteSessionQuery({ sesid, sql }) { //process.send({ msgtype: 'error', error: e.message }); } - const resultIndexHolder = { - value: 0, + const queryStreamInfoHolder = { + resultIndex: 0, + canceled: false, }; for (const sqlItem of splitQuery(sql, { ...driver.getQuerySplitterOptions('stream'), returnRichInfo: true, })) { - await handleQueryStream(dbhan, driver, resultIndexHolder, sqlItem, sesid); + await handleQueryStream(dbhan, driver, queryStreamInfoHolder, sqlItem, sesid); + if (queryStreamInfoHolder.canceled) { + break; + } } process.send({ msgtype: 'done', sesid }); } diff --git a/packages/api/src/proc/sessionProcess.js b/packages/api/src/proc/sessionProcess.js index 7c6c3b4a4..7560f30f9 100644 --- a/packages/api/src/proc/sessionProcess.js +++ b/packages/api/src/proc/sessionProcess.js @@ -138,18 +138,23 @@ async function handleExecuteQuery({ sql, autoCommit }) { executingScripts++; try { - const resultIndexHolder = { - value: 0, + const queryStreamInfoHolder = { + resultIndex: 0, + canceled: false, }; for (const sqlItem of splitQuery(sql, { ...driver.getQuerySplitterOptions('stream'), returnRichInfo: true, })) { - await handleQueryStream(dbhan, driver, resultIndexHolder, sqlItem); + await handleQueryStream(dbhan, driver, queryStreamInfoHolder, sqlItem); // const handler = new StreamHandler(resultIndex); // const stream = await driver.stream(systemConnection, sqlItem, handler); // handler.stream = stream; // resultIndex = handler.resultIndex; + + if (queryStreamInfoHolder.canceled) { + break; + } } process.send({ msgtype: 'done', autoCommit }); } finally { diff --git a/packages/api/src/utility/handleQueryStream.js b/packages/api/src/utility/handleQueryStream.js index 2ba193395..e0f64ba73 100644 --- a/packages/api/src/utility/handleQueryStream.js +++ b/packages/api/src/utility/handleQueryStream.js @@ -91,7 +91,7 @@ class QueryStreamTableWriter { } class StreamHandler { - constructor(resultIndexHolder, resolve, startLine, sesid = undefined) { + constructor(queryStreamInfoHolder, resolve, startLine, sesid = undefined) { this.recordset = this.recordset.bind(this); this.startLine = startLine; this.sesid = sesid; @@ -104,7 +104,7 @@ class StreamHandler { // this.stream = null; this.plannedStats = false; - this.resultIndexHolder = resultIndexHolder; + this.queryStreamInfoHolder = queryStreamInfoHolder; this.resolve = resolve; // currentHandlers = [...currentHandlers, this]; } @@ -121,9 +121,9 @@ class StreamHandler { this.currentWriter = new QueryStreamTableWriter(this.sesid); this.currentWriter.initializeFromQuery( Array.isArray(columns) ? { columns } : columns, - this.resultIndexHolder.value + this.queryStreamInfoHolder.resultIndex ); - this.resultIndexHolder.value += 1; + this.queryStreamInfoHolder.resultIndex += 1; // this.writeCurrentStats(); @@ -153,14 +153,17 @@ class StreamHandler { line: this.startLine + info.line, }; } + if (info.severity == 'error') { + this.queryStreamInfoHolder.canceled = true; + } process.send({ msgtype: 'info', info, sesid: this.sesid }); } } -function handleQueryStream(dbhan, driver, resultIndexHolder, sqlItem, sesid = undefined) { +function handleQueryStream(dbhan, driver, queryStreamInfoHolder, sqlItem, sesid = undefined) { return new Promise((resolve, reject) => { const start = sqlItem.trimStart || sqlItem.start; - const handler = new StreamHandler(resultIndexHolder, resolve, start && start.line, sesid); + const handler = new StreamHandler(queryStreamInfoHolder, resolve, start && start.line, sesid); driver.stream(dbhan, sqlItem.text, handler); }); }