19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
# File 'app/sql_parser.rb', line 19
def self.parse(sql)
scanner = StringScanner.new(sql)
statements = []
single_quoted = false
double_quoted = false
= false
= false
escaped = false
current = ''
start = 0
until scanner.eos?
current ||= ''
char = scanner.getch
current += char
if (single_quoted || double_quoted) && !escaped && char == "'" && scanner.peek(1) == "'"
current += scanner.getch
elsif escaped
escaped = false
elsif !single_quoted && !double_quoted && !escaped && ! && char == '/' && scanner.peek(1) == '*'
current += scanner.getch
= true
elsif && char == '*' && scanner.peek(1) == '/'
= false
elsif || ( && char != "\n")
next
elsif !single_quoted && !double_quoted && !escaped && ! &&
char == '-' && scanner.peek(2).match?(/-[ \n\t]/)
current += scanner.getch
= true
elsif !single_quoted && !double_quoted && !escaped && ! && char == '#'
= true
elsif && char == "\n"
= false
elsif
= false if char == "\n"
elsif char == '\\'
escaped = true
elsif char == "'"
single_quoted = !single_quoted unless double_quoted
elsif char == '"'
double_quoted = !double_quoted unless single_quoted
elsif char == ';' && !single_quoted && !double_quoted
current += scanner.scan(/[ \t]*(?=\n)/) || ''
current += scanner.scan(/[ \t]*--[ \t][^\n]*/) || ''
current += scanner.scan(/[ \t]*#[^\n]*/) || ''
while (more = scanner.scan(/\n[ \t]*(?=\n)/))
current += more
end
if scanner.rest_size == scanner.match?(/[ \t\n]*/)
current += scanner.rest
scanner.terminate
end
statements << [current, start, scanner.pos]
start = scanner.pos
current = nil
end
end
statements << [current, start, scanner.pos] unless current.nil?
statements
end
|