query splitter refactor

This commit is contained in:
Jan Prochazka
2021-06-03 11:27:49 +02:00
parent a76e742ce6
commit 0c48a5ee09
26 changed files with 203 additions and 172 deletions

View File

@@ -7,6 +7,7 @@ export interface SplitterOptions {
allowCustomDelimiter: boolean;
allowGoDelimiter: boolean;
allowDollarDollarString: boolean;
noSplit: boolean;
}
export const defaultSplitterOptions: SplitterOptions = {
@@ -18,6 +19,7 @@ export const defaultSplitterOptions: SplitterOptions = {
allowCustomDelimiter: false,
allowGoDelimiter: false,
allowDollarDollarString: false,
noSplit: false,
};
export const mysqlSplitterOptions: SplitterOptions = {
@@ -48,3 +50,17 @@ export const postgreSplitterOptions: SplitterOptions = {
stringsEnds: { "'": "'", '"': '"' },
stringEscapes: { "'": "'", '"': '"' },
};
export const sqliteSplitterOptions: SplitterOptions = {
...defaultSplitterOptions,
stringsBegins: ["'", '"'],
stringsEnds: { "'": "'", '"': '"' },
stringEscapes: { "'": "'", '"': '"' },
};
export const noSplitSplitterOptions: SplitterOptions = {
...defaultSplitterOptions,
noSplit: true,
};

View File

@@ -162,6 +162,15 @@ function pushQuery(context) {
}
export function splitQuery(sql: string, options: SplitterOptions = null): string[] {
const usedOptions = {
...defaultSplitterOptions,
...options,
};
if (usedOptions.noSplit) {
return [sql];
}
const context: SplitExecutionContext = {
source: sql,
end: sql.length,
@@ -170,10 +179,7 @@ export function splitQuery(sql: string, options: SplitterOptions = null): string
currentCommandStart: 0,
output: [],
wasDataOnLine: false,
options: {
...defaultSplitterOptions,
...options,
},
options: usedOptions,
};
while (context.position < context.end) {

View File

@@ -1,4 +1,4 @@
import { mysqlSplitterOptions, mssqlSplitterOptions, postgreSplitterOptions } from './options';
import { mysqlSplitterOptions, mssqlSplitterOptions, postgreSplitterOptions, noSplitSplitterOptions } from './options';
import { splitQuery } from './splitQuery';
test('simple query', () => {
@@ -71,3 +71,9 @@ test('go delimiter', () => {
const output = splitQuery(input, mssqlSplitterOptions);
expect(output).toEqual(['SELECT 1', 'SELECT 2']);
});
test('no split', () => {
const input = 'SELECT 1;SELECT 2';
const output = splitQuery(input, noSplitSplitterOptions);
expect(output).toEqual(['SELECT 1;SELECT 2']);
});