@@ -214,51 +214,103 @@ export function sanitizeQsqlQuery(query: string): string {
214214 let stringChar = "" ;
215215 let i = 0 ;
216216
217- const isLineBreak = ( c : string ) => c === "\n" || c === "\r" ;
218-
219217 while ( i < query . length ) {
220218 const char = query [ i ] ;
221219
222- // Start or end of string
223- if ( char === '"' || char === "'" ) {
224- if ( ! inString ) {
225- inString = true ;
226- stringChar = char ;
227- } else if ( char === stringChar ) {
228- inString = false ;
229- }
220+ if ( isStringStart ( char , inString ) ) {
221+ ( { inString, stringChar, result, i } = handleStringStart (
222+ char ,
223+ result ,
224+ i ,
225+ ) ) ;
226+ } else if ( isStringEnd ( char , inString , stringChar ) ) {
227+ ( { inString, result, i } = handleStringEnd ( result , i ) ) ;
228+ } else if ( inString ) {
229+ ( { result, i } = handleInsideString ( char , result , i ) ) ;
230+ } else if ( isBlockCommentStart ( char , query , i ) ) {
231+ i = skipBlockComment ( query , i ) ;
232+ } else if ( isLineCommentStart ( char ) ) {
233+ i = skipLineComment ( query , i ) ;
234+ } else {
230235 result += char ;
231236 i ++ ;
232237 }
238+ }
233239
234- // Inside string: preserve everything
235- else if ( inString ) {
236- result += char ;
237- i ++ ;
238- }
240+ return normalizeLineBreaks ( result . trim ( ) ) ;
241+ }
239242
240- // Block comment: / ... \
241- else if ( char === "/" && query . indexOf ( "\\" , i ) > i ) {
242- const end = query . indexOf ( "\\" , i ) ;
243- i = end >= 0 ? end + 1 : query . length ;
244- }
243+ function isStringStart ( char : string , inString : boolean ) : boolean {
244+ return ! inString && ( char === '"' || char === "'" ) ;
245+ }
245246
246- // Line comment: / to end of line
247- else if ( char === "/" ) {
248- while ( i < query . length && ! isLineBreak ( query [ i ] ) ) i ++ ;
249- if ( query [ i ] === "\r" && query [ i + 1 ] === "\n" ) i += 2 ;
250- else if ( isLineBreak ( query [ i ] ) ) i ++ ;
251- }
247+ function handleStringStart (
248+ char : string ,
249+ result : string ,
250+ i : number ,
251+ ) : { inString : boolean ; stringChar : string ; result : string ; i : number } {
252+ return {
253+ inString : true ,
254+ stringChar : char ,
255+ result : result + char ,
256+ i : i + 1 ,
257+ } ;
258+ }
252259
253- // Normal character
254- else {
255- result += char ;
256- i ++ ;
257- }
260+ function isStringEnd (
261+ char : string ,
262+ inString : boolean ,
263+ stringChar : string ,
264+ ) : boolean {
265+ return inString && char === stringChar ;
266+ }
267+
268+ function handleStringEnd (
269+ result : string ,
270+ i : number ,
271+ ) : { inString : boolean ; result : string ; i : number } {
272+ return {
273+ inString : false ,
274+ result : result + result [ result . length - 1 ] , // append last char again
275+ i : i + 1 ,
276+ } ;
277+ }
278+
279+ function handleInsideString (
280+ char : string ,
281+ result : string ,
282+ i : number ,
283+ ) : { result : string ; i : number } {
284+ return {
285+ result : result + char ,
286+ i : i + 1 ,
287+ } ;
288+ }
289+
290+ function isBlockCommentStart ( char : string , query : string , i : number ) : boolean {
291+ return char === "/" && query . indexOf ( "\\" , i ) > i ;
292+ }
293+
294+ function skipBlockComment ( query : string , i : number ) : number {
295+ const end = query . indexOf ( "\\" , i ) ;
296+ return end !== - 1 ? end + 1 : query . length ;
297+ }
298+
299+ function isLineCommentStart ( char : string ) : boolean {
300+ return char === "/" ;
301+ }
302+
303+ function skipLineComment ( query : string , i : number ) : number {
304+ while ( i < query . length && query [ i ] !== "\n" && query [ i ] !== "\r" ) {
305+ i ++ ;
258306 }
307+ if ( query [ i ] === "\r" && query [ i + 1 ] === "\n" ) return i + 2 ;
308+ if ( query [ i ] === "\n" || query [ i ] === "\r" ) return i + 1 ;
309+ return i ;
310+ }
259311
260- // Final pass: normalize line breaks to ;
261- return result . replace ( / ( [ ^ \s ; ] ) (?: \r ? \n ) + (? = \S ) / g, "$1;" ) . trim ( ) ;
312+ function normalizeLineBreaks ( input : string ) : string {
313+ return input . replace ( / ( [ ^ \s ; ] ) (?: \r ? \n ) + (? = \S ) / g, "$1;" ) ;
262314}
263315
264316export function generateQSqlBody (
0 commit comments