Class: SQLParser::SQLVisitor

Inherits:
Object
  • Object
show all
Defined in:
lib/sql-parser/sql_visitor.rb

Instance Method Summary collapse

Constructor Details

#initializeSQLVisitor

Returns a new instance of SQLVisitor.



5
6
7
# File 'lib/sql-parser/sql_visitor.rb', line 5

def initialize
  @negated = false
end

Instance Method Details

#visit(node) ⇒ Object



9
10
11
# File 'lib/sql-parser/sql_visitor.rb', line 9

def visit(node)
  node.accept(self)
end

#visit_Add(o) ⇒ Object



278
279
280
# File 'lib/sql-parser/sql_visitor.rb', line 278

def visit_Add(o)
  arithmetic('+', o)
end

#visit_All(o) ⇒ Object



73
74
75
# File 'lib/sql-parser/sql_visitor.rb', line 73

def visit_All(o)
  '*'
end

#visit_And(o) ⇒ Object



126
127
128
# File 'lib/sql-parser/sql_visitor.rb', line 126

def visit_And(o)
  search_condition('AND', o)
end

#visit_ApproximateFloat(o) ⇒ Object



326
327
328
# File 'lib/sql-parser/sql_visitor.rb', line 326

def visit_ApproximateFloat(o)
  "#{visit(o.mantissa)}E#{visit(o.exponent)}"
end

#visit_As(o) ⇒ Object



266
267
268
# File 'lib/sql-parser/sql_visitor.rb', line 266

def visit_As(o)
  "#{visit(o.value)} AS #{visit(o.column)}"
end

#visit_Ascending(o) ⇒ Object



94
95
96
# File 'lib/sql-parser/sql_visitor.rb', line 94

def visit_Ascending(o)
  "#{visit(o.column)} ASC"
end

#visit_Average(o) ⇒ Object



214
215
216
# File 'lib/sql-parser/sql_visitor.rb', line 214

def visit_Average(o)
  aggregate('AVG', o)
end

#visit_Between(o) ⇒ Object



170
171
172
173
174
175
176
# File 'lib/sql-parser/sql_visitor.rb', line 170

def visit_Between(o)
  if @negated
    "#{visit(o.left)} NOT BETWEEN #{visit(o.min)} AND #{visit(o.max)}"
  else
    "#{visit(o.left)} BETWEEN #{visit(o.min)} AND #{visit(o.max)}"
  end
end

#visit_Column(o) ⇒ Object



262
263
264
# File 'lib/sql-parser/sql_visitor.rb', line 262

def visit_Column(o)
  quote(o.name)
end

#visit_Count(o) ⇒ Object



218
219
220
# File 'lib/sql-parser/sql_visitor.rb', line 218

def visit_Count(o)
  aggregate('COUNT', o)
end

#visit_CrossJoin(o) ⇒ Object



222
223
224
# File 'lib/sql-parser/sql_visitor.rb', line 222

def visit_CrossJoin(o)
  "#{visit(o.left)} CROSS JOIN #{visit(o.right)}"
end

#visit_CurrentUser(o) ⇒ Object



310
311
312
# File 'lib/sql-parser/sql_visitor.rb', line 310

def visit_CurrentUser(o)
  'CURRENT_USER'
end

#visit_Date(o) ⇒ Object



318
319
320
# File 'lib/sql-parser/sql_visitor.rb', line 318

def visit_Date(o)
  "DATE '%s'" % escape(o.value.strftime('%Y-%m-%d'))
end

#visit_DateTime(o) ⇒ Object



314
315
316
# File 'lib/sql-parser/sql_visitor.rb', line 314

def visit_DateTime(o)
  "'%s'" % escape(o.value.strftime('%Y-%m-%d %H:%M:%S'))
end

#visit_Delete(o) ⇒ Object



13
14
15
16
17
# File 'lib/sql-parser/sql_visitor.rb', line 13

def visit_Delete(o)
  name = visit(o.from_clause)
  where_clause = o.where_clause.nil? ? '' : ' ' + visit(o.where_clause)
  "DELETE #{name}#{where_clause}"
end

#visit_Descending(o) ⇒ Object



98
99
100
# File 'lib/sql-parser/sql_visitor.rb', line 98

def visit_Descending(o)
  "#{visit(o.column)} DESC"
end

#visit_DirectSelect(o) ⇒ Object



43
44
45
46
47
48
# File 'lib/sql-parser/sql_visitor.rb', line 43

def visit_DirectSelect(o)
  [
    o.query_expression,
    o.order_by
  ].compact.collect { |e| visit(e) }.join(' ')
end

#visit_Distinct(o) ⇒ Object



69
70
71
# File 'lib/sql-parser/sql_visitor.rb', line 69

def visit_Distinct(o)
  "DISTINCT(#{visit(o.column)})"
end

#visit_Divide(o) ⇒ Object



274
275
276
# File 'lib/sql-parser/sql_visitor.rb', line 274

def visit_Divide(o)
  arithmetic('/', o)
end

#visit_Equals(o) ⇒ Object



194
195
196
197
198
199
200
# File 'lib/sql-parser/sql_visitor.rb', line 194

def visit_Equals(o)
  if @negated
    comparison('<>', o)
  else
    comparison('=', o)
  end
end

#visit_Exists(o) ⇒ Object



130
131
132
133
134
135
136
# File 'lib/sql-parser/sql_visitor.rb', line 130

def visit_Exists(o)
  if @negated
    "NOT EXISTS #{visit(o.table_subquery)}"
  else
    "EXISTS #{visit(o.table_subquery)}"
  end
end

#visit_False(o) ⇒ Object



302
303
304
# File 'lib/sql-parser/sql_visitor.rb', line 302

def visit_False(o)
  'FALSE'
end

#visit_Float(o) ⇒ Object



330
331
332
# File 'lib/sql-parser/sql_visitor.rb', line 330

def visit_Float(o)
  o.value.to_s
end

#visit_FromClause(o) ⇒ Object



86
87
88
# File 'lib/sql-parser/sql_visitor.rb', line 86

def visit_FromClause(o)
  "FROM #{arrayize(o.tables)}"
end

#visit_FullJoin(o) ⇒ Object



246
247
248
# File 'lib/sql-parser/sql_visitor.rb', line 246

def visit_FullJoin(o)
  qualified_join('FULL', o)
end

#visit_FullOuterJoin(o) ⇒ Object



250
251
252
# File 'lib/sql-parser/sql_visitor.rb', line 250

def visit_FullOuterJoin(o)
  qualified_join('FULL OUTER', o)
end

#visit_Greater(o) ⇒ Object



186
187
188
# File 'lib/sql-parser/sql_visitor.rb', line 186

def visit_Greater(o)
  comparison('>', o)
end

#visit_GreaterOrEquals(o) ⇒ Object



178
179
180
# File 'lib/sql-parser/sql_visitor.rb', line 178

def visit_GreaterOrEquals(o)
  comparison('>=', o)
end

#visit_GroupByClause(o) ⇒ Object



106
107
108
# File 'lib/sql-parser/sql_visitor.rb', line 106

def visit_GroupByClause(o)
  "GROUP BY #{arrayize(o.columns)}"
end

#visit_HavingClause(o) ⇒ Object



102
103
104
# File 'lib/sql-parser/sql_visitor.rb', line 102

def visit_HavingClause(o)
  "HAVING #{visit(o.search_condition)}"
end

#visit_In(o) ⇒ Object



154
155
156
157
158
159
160
# File 'lib/sql-parser/sql_visitor.rb', line 154

def visit_In(o)
  if @negated
    comparison('NOT IN', o)
  else
    comparison('IN', o)
  end
end

#visit_InColumnList(o) ⇒ Object



162
163
164
# File 'lib/sql-parser/sql_visitor.rb', line 162

def visit_InColumnList(o)
  "(#{arrayize(o.columns)})"
end

#visit_InnerJoin(o) ⇒ Object



226
227
228
# File 'lib/sql-parser/sql_visitor.rb', line 226

def visit_InnerJoin(o)
  qualified_join('INNER', o)
end

#visit_Insert(o) ⇒ Object



36
37
38
39
40
41
# File 'lib/sql-parser/sql_visitor.rb', line 36

def visit_Insert(o)
  name = visit(o.table_reference)
  columns = ' ' + visit(o.column_list) if o.column_list
  values = ' VALUES ' + visit(o.in_value_list)
  "INSERT INTO #{name}#{columns}#{values}"
end

#visit_Integer(o) ⇒ Object



334
335
336
# File 'lib/sql-parser/sql_visitor.rb', line 334

def visit_Integer(o)
  o.value.to_s
end

#visit_InValueList(o) ⇒ Object



166
167
168
# File 'lib/sql-parser/sql_visitor.rb', line 166

def visit_InValueList(o)
  "(#{arrayize(o.values)})"
end

#visit_Is(o) ⇒ Object



138
139
140
141
142
143
144
# File 'lib/sql-parser/sql_visitor.rb', line 138

def visit_Is(o)
  if @negated
    comparison('IS NOT', o)
  else
    comparison('IS', o)
  end
end

#visit_LeftJoin(o) ⇒ Object



230
231
232
# File 'lib/sql-parser/sql_visitor.rb', line 230

def visit_LeftJoin(o)
  qualified_join('LEFT', o)
end

#visit_LeftOuterJoin(o) ⇒ Object



234
235
236
# File 'lib/sql-parser/sql_visitor.rb', line 234

def visit_LeftOuterJoin(o)
  qualified_join('LEFT OUTER', o)
end

#visit_Less(o) ⇒ Object



190
191
192
# File 'lib/sql-parser/sql_visitor.rb', line 190

def visit_Less(o)
  comparison('<', o)
end

#visit_LessOrEquals(o) ⇒ Object



182
183
184
# File 'lib/sql-parser/sql_visitor.rb', line 182

def visit_LessOrEquals(o)
  comparison('<=', o)
end

#visit_Like(o) ⇒ Object



146
147
148
149
150
151
152
# File 'lib/sql-parser/sql_visitor.rb', line 146

def visit_Like(o)
  if @negated
    comparison('NOT LIKE', o)
  else
    comparison('LIKE', o)
  end
end

#visit_Maximum(o) ⇒ Object



210
211
212
# File 'lib/sql-parser/sql_visitor.rb', line 210

def visit_Maximum(o)
  aggregate('MAX', o)
end

#visit_Minimum(o) ⇒ Object



206
207
208
# File 'lib/sql-parser/sql_visitor.rb', line 206

def visit_Minimum(o)
  aggregate('MIN', o)
end

#visit_Multiply(o) ⇒ Object



270
271
272
# File 'lib/sql-parser/sql_visitor.rb', line 270

def visit_Multiply(o)
  arithmetic('*', o)
end

#visit_Not(o) ⇒ Object



286
287
288
# File 'lib/sql-parser/sql_visitor.rb', line 286

def visit_Not(o)
  negate { visit(o.value) }
end

#visit_Null(o) ⇒ Object



306
307
308
# File 'lib/sql-parser/sql_visitor.rb', line 306

def visit_Null(o)
  'NULL'
end

#visit_On(o) ⇒ Object



114
115
116
# File 'lib/sql-parser/sql_visitor.rb', line 114

def visit_On(o)
  "ON #{visit(o.search_condition)}"
end

#visit_Or(o) ⇒ Object



122
123
124
# File 'lib/sql-parser/sql_visitor.rb', line 122

def visit_Or(o)
  search_condition('OR', o)
end

#visit_OrderBy(o) ⇒ Object



50
51
52
# File 'lib/sql-parser/sql_visitor.rb', line 50

def visit_OrderBy(o)
  "ORDER BY #{arrayize(o.sort_specification)}"
end

#visit_OrderClause(o) ⇒ Object



90
91
92
# File 'lib/sql-parser/sql_visitor.rb', line 90

def visit_OrderClause(o)
  "ORDER BY #{arrayize(o.columns)}"
end

#visit_QualifiedColumn(o) ⇒ Object



258
259
260
# File 'lib/sql-parser/sql_visitor.rb', line 258

def visit_QualifiedColumn(o)
  "#{visit(o.table)}.#{visit(o.column)}"
end

#visit_RightJoin(o) ⇒ Object



238
239
240
# File 'lib/sql-parser/sql_visitor.rb', line 238

def visit_RightJoin(o)
  qualified_join('RIGHT', o)
end

#visit_RightOuterJoin(o) ⇒ Object



242
243
244
# File 'lib/sql-parser/sql_visitor.rb', line 242

def visit_RightOuterJoin(o)
  qualified_join('RIGHT OUTER', o)
end

#visit_Select(o) ⇒ Object



58
59
60
61
62
63
# File 'lib/sql-parser/sql_visitor.rb', line 58

def visit_Select(o)
  # FIXME: This feels like a hack
  initialize

  "SELECT #{visit_all([o.list, o.table_expression].compact).join(' ')}"
end

#visit_SelectList(o) ⇒ Object



65
66
67
# File 'lib/sql-parser/sql_visitor.rb', line 65

def visit_SelectList(o)
  arrayize(o.columns)
end

#visit_String(o) ⇒ Object



322
323
324
# File 'lib/sql-parser/sql_visitor.rb', line 322

def visit_String(o)
  "'%s'" % escape(o.value)
end

#visit_Subquery(o) ⇒ Object



54
55
56
# File 'lib/sql-parser/sql_visitor.rb', line 54

def visit_Subquery(o)
  "(#{visit(o.query_specification)})"
end

#visit_Subtract(o) ⇒ Object



282
283
284
# File 'lib/sql-parser/sql_visitor.rb', line 282

def visit_Subtract(o)
  arithmetic('-', o)
end

#visit_Sum(o) ⇒ Object



202
203
204
# File 'lib/sql-parser/sql_visitor.rb', line 202

def visit_Sum(o)
  aggregate('SUM', o)
end

#visit_Table(o) ⇒ Object



254
255
256
# File 'lib/sql-parser/sql_visitor.rb', line 254

def visit_Table(o)
  quote(o.name)
end

#visit_TableExpression(o) ⇒ Object



77
78
79
80
81
82
83
84
# File 'lib/sql-parser/sql_visitor.rb', line 77

def visit_TableExpression(o)
  [
    o.from_clause,
    o.where_clause,
    o.group_by_clause,
    o.having_clause
  ].compact.collect { |e| visit(e) }.join(' ')
end

#visit_True(o) ⇒ Object



298
299
300
# File 'lib/sql-parser/sql_visitor.rb', line 298

def visit_True(o)
  'TRUE'
end

#visit_UnaryMinus(o) ⇒ Object



294
295
296
# File 'lib/sql-parser/sql_visitor.rb', line 294

def visit_UnaryMinus(o)
  "-#{visit(o.value)}"
end

#visit_UnaryPlus(o) ⇒ Object



290
291
292
# File 'lib/sql-parser/sql_visitor.rb', line 290

def visit_UnaryPlus(o)
  "+#{visit(o.value)}"
end

#visit_Update(o) ⇒ Object



19
20
21
22
23
24
# File 'lib/sql-parser/sql_visitor.rb', line 19

def visit_Update(o)
  name = visit(o.table_reference)
  update_column_list = visit(o.update_column_list)
  where_clause = o.where_clause.nil? ? '' : ' ' + visit(o.where_clause)
  "UPDATE #{name} SET #{update_column_list}#{where_clause}"
end

#visit_UpdateColumn(o) ⇒ Object



26
27
28
29
30
# File 'lib/sql-parser/sql_visitor.rb', line 26

def visit_UpdateColumn(o)
  column = visit(o.column)
  value = visit(o.value)
  "#{column} = #{value}"
end

#visit_UpdateColumnList(o) ⇒ Object



32
33
34
# File 'lib/sql-parser/sql_visitor.rb', line 32

def visit_UpdateColumnList(o)
  arrayize(o.update_columns)
end

#visit_Using(o) ⇒ Object



118
119
120
# File 'lib/sql-parser/sql_visitor.rb', line 118

def visit_Using(o)
  "USING (#{arrayize(o.columns)})"
end

#visit_WhereClause(o) ⇒ Object



110
111
112
# File 'lib/sql-parser/sql_visitor.rb', line 110

def visit_WhereClause(o)
  "WHERE #{visit(o.search_condition)}"
end