sql-parser-tl 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,556 @@
1
+ module SQLParser
2
+
3
+ module Statement
4
+
5
+ class Node
6
+
7
+ def accept(visitor)
8
+ klass = self.class.ancestors.find do |ancestor|
9
+ visitor.respond_to?("visit_#{demodulize(ancestor.name)}")
10
+ end
11
+
12
+ if klass
13
+ visitor.__send__("visit_#{demodulize(klass.name)}", self)
14
+ else
15
+ raise "No visitor for #{self.class.name}"
16
+ end
17
+ end
18
+
19
+ def to_sql
20
+ SQLVisitor.new.visit(self)
21
+ end
22
+
23
+ private
24
+
25
+ def demodulize(str)
26
+ str.split('::')[-1]
27
+ end
28
+
29
+ end
30
+
31
+ class Insert < Node
32
+
33
+ def initialize(table_reference, column_list, in_value_list)
34
+ @table_reference = table_reference
35
+ @column_list = column_list
36
+ @in_value_list = in_value_list
37
+ end
38
+
39
+ attr_reader :table_reference
40
+ attr_reader :column_list
41
+ attr_reader :in_value_list
42
+
43
+ end
44
+
45
+ class DirectSelect < Node
46
+
47
+ def initialize(query_expression, order_by = nil, limit_clause = nil)
48
+ @query_expression = query_expression
49
+ @order_by = order_by
50
+ @limit_clause = limit_clause
51
+ end
52
+
53
+ attr_reader :query_expression
54
+ attr_reader :order_by
55
+ attr_reader :limit_clause
56
+
57
+ end
58
+
59
+ class OrderBy < Node
60
+
61
+ def initialize(sort_specification)
62
+ @sort_specification = Array(sort_specification)
63
+ end
64
+
65
+ attr_reader :sort_specification
66
+
67
+ end
68
+
69
+ class Subquery < Node
70
+
71
+ def initialize(query_specification)
72
+ @query_specification = query_specification
73
+ end
74
+
75
+ attr_reader :query_specification
76
+
77
+ end
78
+
79
+ class Select < Node
80
+ def initialize(list, table_expression = nil)
81
+ @list = list
82
+ @table_expression = table_expression
83
+ end
84
+
85
+ attr_reader :list
86
+ attr_reader :table_expression
87
+
88
+ end
89
+
90
+ class SelectList < Node
91
+
92
+ def initialize(columns)
93
+ @columns = Array(columns)
94
+ end
95
+
96
+ attr_reader :columns
97
+
98
+ end
99
+
100
+ class Distinct < Node
101
+
102
+ def initialize(column)
103
+ @column = column
104
+ end
105
+
106
+ attr_reader :column
107
+
108
+ end
109
+
110
+ class All < Node
111
+ end
112
+
113
+ class TableExpression < Node
114
+
115
+ def initialize(from_clause, where_clause = nil, group_by_clause = nil, having_clause = nil)
116
+ @from_clause = from_clause
117
+ @where_clause = where_clause
118
+ @group_by_clause = group_by_clause
119
+ @having_clause = having_clause
120
+ end
121
+
122
+ attr_reader :from_clause
123
+ attr_reader :where_clause
124
+ attr_reader :group_by_clause
125
+ attr_reader :having_clause
126
+
127
+ end
128
+
129
+ class FromClause < Node
130
+
131
+ def initialize(tables)
132
+ @tables = Array(tables)
133
+ end
134
+
135
+ attr_reader :tables
136
+
137
+ end
138
+
139
+ class OrderClause < Node
140
+
141
+ def initialize(columns)
142
+ @columns = Array(columns)
143
+ end
144
+
145
+ attr_reader :columns
146
+
147
+ end
148
+
149
+ class OrderSpecification < Node
150
+
151
+ def initialize(column)
152
+ @column = column
153
+ end
154
+
155
+ attr_reader :column
156
+
157
+ end
158
+
159
+ class Ascending < OrderSpecification
160
+ end
161
+
162
+ class Descending < OrderSpecification
163
+ end
164
+
165
+ class HavingClause < Node
166
+
167
+ def initialize(search_condition)
168
+ @search_condition = search_condition
169
+ end
170
+
171
+ attr_reader :search_condition
172
+
173
+ end
174
+
175
+ class GroupByClause < Node
176
+
177
+ def initialize(columns)
178
+ @columns = Array(columns)
179
+ end
180
+
181
+ attr_reader :columns
182
+
183
+ end
184
+
185
+ class WhereClause < Node
186
+
187
+ def initialize(search_condition)
188
+ @search_condition = search_condition
189
+ end
190
+
191
+ attr_reader :search_condition
192
+
193
+ end
194
+
195
+ class LimitClause < Node
196
+
197
+ def initialize(limit, offset)
198
+ @limit = limit
199
+ @offset = offset
200
+ end
201
+
202
+ attr_reader :limit
203
+ attr_reader :offset
204
+ end
205
+
206
+ class On < Node
207
+
208
+ def initialize(search_condition)
209
+ @search_condition = search_condition
210
+ end
211
+
212
+ attr_reader :search_condition
213
+
214
+ end
215
+
216
+ class SearchCondition < Node
217
+
218
+ def initialize(left, right)
219
+ @left = left
220
+ @right = right
221
+ end
222
+
223
+ attr_reader :left
224
+ attr_reader :right
225
+
226
+ end
227
+
228
+ class Using < Node
229
+
230
+ def initialize(columns)
231
+ @columns = Array(columns)
232
+ end
233
+
234
+ attr_reader :columns
235
+
236
+ end
237
+
238
+ class Or < SearchCondition
239
+ end
240
+
241
+ class And < SearchCondition
242
+ end
243
+
244
+ class Exists < Node
245
+
246
+ def initialize(table_subquery)
247
+ @table_subquery = table_subquery
248
+ end
249
+
250
+ attr_reader :table_subquery
251
+
252
+ end
253
+
254
+ class ComparisonPredicate < Node
255
+
256
+ def initialize(left, right)
257
+ @left = left
258
+ @right = right
259
+ end
260
+
261
+ attr_reader :left
262
+ attr_reader :right
263
+
264
+ end
265
+
266
+ class Is < ComparisonPredicate
267
+ end
268
+
269
+ class Like < ComparisonPredicate
270
+ end
271
+
272
+ class In < ComparisonPredicate
273
+ end
274
+
275
+ class InValueList < Node
276
+
277
+ def initialize(values)
278
+ @values = values
279
+ end
280
+
281
+ attr_reader :values
282
+
283
+ end
284
+
285
+ class InColumnList < Node
286
+
287
+ def initialize(columns)
288
+ @columns = columns
289
+ end
290
+
291
+ attr_reader :columns
292
+
293
+ end
294
+
295
+ class Between < ComparisonPredicate
296
+ end
297
+
298
+ class BetweenRange < Node
299
+
300
+ def initialize(min, max)
301
+ @min = min
302
+ @max = max
303
+ end
304
+
305
+ attr_reader :min
306
+ attr_reader :max
307
+
308
+ end
309
+
310
+ class GreaterOrEquals < ComparisonPredicate
311
+ end
312
+
313
+ class LessOrEquals < ComparisonPredicate
314
+ end
315
+
316
+ class Greater < ComparisonPredicate
317
+ end
318
+
319
+ class Less < ComparisonPredicate
320
+ end
321
+
322
+ class Equals < ComparisonPredicate
323
+ end
324
+
325
+ class Aggregate < Node
326
+
327
+ def initialize(column)
328
+ @column = column
329
+ end
330
+
331
+ attr_reader :column
332
+
333
+ end
334
+
335
+ class Sum < Aggregate
336
+ end
337
+
338
+ class Minimum < Aggregate
339
+ end
340
+
341
+ class Maximum < Aggregate
342
+ end
343
+
344
+ class Average < Aggregate
345
+ end
346
+
347
+ class Count < Aggregate
348
+ end
349
+
350
+ class JoinedTable < Node
351
+
352
+ def initialize(left, right)
353
+ @left = left
354
+ @right = right
355
+ end
356
+
357
+ attr_reader :left
358
+ attr_reader :right
359
+
360
+ end
361
+
362
+ class CrossJoin < JoinedTable
363
+ end
364
+
365
+ class QualifiedJoin < JoinedTable
366
+
367
+ def initialize(left, right, search_condition)
368
+ super(left, right)
369
+ @search_condition = search_condition
370
+ end
371
+
372
+ attr_reader :search_condition
373
+
374
+ end
375
+
376
+ class InnerJoin < QualifiedJoin
377
+ end
378
+
379
+ class LeftJoin < QualifiedJoin
380
+ end
381
+
382
+ class LeftOuterJoin < QualifiedJoin
383
+ end
384
+
385
+ class RightJoin < QualifiedJoin
386
+ end
387
+
388
+ class RightOuterJoin < QualifiedJoin
389
+ end
390
+
391
+ class FullJoin < QualifiedJoin
392
+ end
393
+
394
+ class FullOuterJoin < QualifiedJoin
395
+ end
396
+
397
+ class QualifiedColumn < Node
398
+
399
+ def initialize(table, column)
400
+ @table = table
401
+ @column = column
402
+ end
403
+
404
+ attr_reader :table
405
+ attr_reader :column
406
+
407
+ end
408
+
409
+ class Identifier < Node
410
+
411
+ def initialize(name)
412
+ @name = name
413
+ end
414
+
415
+ attr_reader :name
416
+
417
+ end
418
+
419
+ class Table < Identifier
420
+ end
421
+
422
+ class Column < Identifier
423
+ end
424
+
425
+ class As < Node
426
+
427
+ def initialize(original, _alias)
428
+ @original = original
429
+ @alias = _alias
430
+ end
431
+
432
+ attr_reader :original
433
+ attr_reader :alias
434
+
435
+ end
436
+
437
+ class IndexHint < Node
438
+
439
+ def initialize(table, index)
440
+ @table = table
441
+ @index = index
442
+ end
443
+
444
+ attr_reader :table
445
+ attr_reader :index
446
+
447
+ end
448
+
449
+ class ForceIndex < IndexHint
450
+ end
451
+
452
+ class UseIndex < IndexHint
453
+ end
454
+
455
+ class IgnoreIndex < IndexHint
456
+ end
457
+
458
+ class Arithmetic < Node
459
+
460
+ def initialize(left, right)
461
+ @left = left
462
+ @right = right
463
+ end
464
+
465
+ attr_reader :left
466
+ attr_reader :right
467
+
468
+ end
469
+
470
+ class Multiply < Arithmetic
471
+ end
472
+
473
+ class Divide < Arithmetic
474
+ end
475
+
476
+ class Add < Arithmetic
477
+ end
478
+
479
+ class Subtract < Arithmetic
480
+ end
481
+
482
+ class Unary < Node
483
+
484
+ def initialize(value)
485
+ @value = value
486
+ end
487
+
488
+ attr_reader :value
489
+
490
+ end
491
+
492
+ class Not < Unary
493
+ end
494
+
495
+ class UnaryPlus < Unary
496
+ end
497
+
498
+ class UnaryMinus < Unary
499
+ end
500
+
501
+ class CurrentUser < Node
502
+ end
503
+
504
+ class True < Node
505
+ end
506
+
507
+ class False < Node
508
+ end
509
+
510
+ class Null < Node
511
+ end
512
+
513
+ class Literal < Node
514
+
515
+ def initialize(value)
516
+ @value = value
517
+ end
518
+
519
+ attr_reader :value
520
+
521
+ end
522
+
523
+ class DateTime < Literal
524
+ end
525
+
526
+ class Date < Literal
527
+ end
528
+
529
+ class String < Literal
530
+
531
+ def +(other)
532
+ self.class.new(@value + other.value)
533
+ end
534
+
535
+ end
536
+
537
+ class ApproximateFloat < Node
538
+
539
+ def initialize(mantissa, exponent)
540
+ @mantissa = mantissa
541
+ @exponent = exponent
542
+ end
543
+
544
+ attr_reader :mantissa
545
+ attr_reader :exponent
546
+
547
+ end
548
+
549
+ class Float < Literal
550
+ end
551
+
552
+ class Integer < Literal
553
+ end
554
+
555
+ end
556
+ end
@@ -0,0 +1,5 @@
1
+ module SQLParser
2
+
3
+ VERSION = '0.0.3'
4
+
5
+ end
data/lib/sql-parser.rb ADDED
@@ -0,0 +1,13 @@
1
+ module SQLParser
2
+
3
+ require 'strscan'
4
+ require 'date'
5
+
6
+ require 'racc/parser'
7
+
8
+ require_relative 'sql-parser/version'
9
+ require_relative 'sql-parser/statement'
10
+ require_relative 'sql-parser/sql_visitor'
11
+ require_relative 'sql-parser/parser.racc.rb'
12
+
13
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sql-parser-tl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Tony Liu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-11-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: racc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.4.12
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.4.12
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rexical
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.5
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.5
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: " A Racc-based Ruby parser for SQL statements; forked from https://github.com/cryodex/sql-parser "
84
+ email: tony.liu@servicenow.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - lib/sql-parser.rb
90
+ - lib/sql-parser/parser.racc
91
+ - lib/sql-parser/parser.racc.rb
92
+ - lib/sql-parser/parser.rex
93
+ - lib/sql-parser/parser.rex.rb
94
+ - lib/sql-parser/sql_visitor.rb
95
+ - lib/sql-parser/statement.rb
96
+ - lib/sql-parser/version.rb
97
+ homepage: https://gitlab.servicenow.net/SWAT/dev/sql-parser
98
+ licenses: []
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubygems_version: 3.3.22
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: Ruby library for parsing SQL statements
119
+ test_files: []