From f7b15cc17e2ec39ee5d5e9a4371ead66145fc3c5 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Mon, 31 May 2021 22:16:30 +0200 Subject: [PATCH] mysql delimiter in code splitter --- packages/querysplitter/src/options.ts | 14 ++++++++------ packages/querysplitter/src/splitQuery.ts | 4 +++- packages/querysplitter/src/splitter.test.ts | 6 ++++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/querysplitter/src/options.ts b/packages/querysplitter/src/options.ts index 94a8d1f87..6f6461642 100644 --- a/packages/querysplitter/src/options.ts +++ b/packages/querysplitter/src/options.ts @@ -1,7 +1,7 @@ export interface SplitterOptions { stringsBegins: string[]; - stringsEnds: { string: string }; - stringEscapes: string[]; + stringsEnds: { [begin: string]: string }; + stringEscapes: { [begin: string]: string }; allowSemicolon: boolean; allowCustomDelimiter: boolean; @@ -9,7 +9,7 @@ export interface SplitterOptions { allowDollarDollarString: boolean; } -export const defaultSplitterOptions = { +export const defaultSplitterOptions: SplitterOptions = { stringsBegins: ["'"], stringsEnds: { "'": "'" }, stringEscapes: { "'": "'" }, @@ -17,17 +17,19 @@ export const defaultSplitterOptions = { allowSemicolon: true, allowCustomDelimiter: false, allowGoDelimiter: false, + allowDollarDollarString: false, }; -export const mysqlSplitterOptions = { +export const mysqlSplitterOptions: SplitterOptions = { ...defaultSplitterOptions, + allowCustomDelimiter: true, stringsBegins: ["'", '`'], stringsEnds: { "'": "'", '`': '`' }, stringEscapes: { "'": '\\', '`': '`' }, }; -export const mssqlSplitterOptions = { +export const mssqlSplitterOptions: SplitterOptions = { ...defaultSplitterOptions, allowSemicolon: false, allowGoDelimiter: true, @@ -37,7 +39,7 @@ export const mssqlSplitterOptions = { stringEscapes: { "'": "'" }, }; -export const postgreSplitterOptions = { +export const postgreSplitterOptions: SplitterOptions = { ...defaultSplitterOptions, allowDollarDollarString: true, diff --git a/packages/querysplitter/src/splitQuery.ts b/packages/querysplitter/src/splitQuery.ts index c987922e4..6b46dcf08 100644 --- a/packages/querysplitter/src/splitQuery.ts +++ b/packages/querysplitter/src/splitQuery.ts @@ -142,8 +142,10 @@ export function splitQuery(sql: string, options: SplitterOptions = null): string context.position += token.length; break; case 'set_delimiter': + pushQuery(context); context.currentDelimiter = token.value; context.position += token.length; + context.currentCommandStart = context.position; break; case 'delimiter': pushQuery(context); @@ -177,6 +179,6 @@ export function splitQuery(sql: string, options: SplitterOptions = null): string // publishStatement(context); // console.log('RESULT', context.output); - + return context.output; } diff --git a/packages/querysplitter/src/splitter.test.ts b/packages/querysplitter/src/splitter.test.ts index 286bddbfe..da3823ac5 100644 --- a/packages/querysplitter/src/splitter.test.ts +++ b/packages/querysplitter/src/splitter.test.ts @@ -41,3 +41,9 @@ test('semicolon inside identyifier - mssql', () => { }); expect(output).toEqual(input); }); + +test('delimiter test', () => { + const input = 'SELECT 1;\n DELIMITER $$\n SELECT 2; SELECT 3; \n DELIMITER ;'; + const output = splitQuery(input, mysqlSplitterOptions); + expect(output).toEqual(['SELECT 1', 'SELECT 2; SELECT 3;']); +});