Class: SQLParser::SQLVisitor

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

Instance Method Summary collapse

Constructor Details

#initializeSQLVisitor



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



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

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

#visit_All(o) ⇒ Object



78
79
80
# File 'lib/sql-parser/sql_visitor.rb', line 78

def visit_All(o)
  o.table.nil? ? '*' : "#{visit(o.table)}.*"
end

#visit_And(o) ⇒ Object



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

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

#visit_ApproximateFloat(o) ⇒ Object



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

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

#visit_As(o) ⇒ Object



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

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

#visit_Ascending(o) ⇒ Object



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

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

#visit_Average(o) ⇒ Object



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

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

#visit_Between(o) ⇒ Object



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

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



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

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

#visit_Count(o) ⇒ Object



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

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

#visit_CrossJoin(o) ⇒ Object



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

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

#visit_CurrentUser(o) ⇒ Object



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

def visit_CurrentUser(o)
  'CURRENT_USER'
end

#visit_Date(o) ⇒ Object



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

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

#visit_DateTime(o) ⇒ Object



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

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



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

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

#visit_DirectSelect(o) ⇒ Object



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

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

#visit_Distinct(o) ⇒ Object



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

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

#visit_Divide(o) ⇒ Object



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

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

#visit_Equals(o) ⇒ Object



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

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

#visit_Exists(o) ⇒ Object



135
136
137
138
139
140
141
# File 'lib/sql-parser/sql_visitor.rb', line 135

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

#visit_False(o) ⇒ Object



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

def visit_False(o)
  'FALSE'
end

#visit_Float(o) ⇒ Object



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

def visit_Float(o)
  o.value.to_s
end

#visit_FromClause(o) ⇒ Object



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

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

#visit_FullJoin(o) ⇒ Object



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

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

#visit_FullOuterJoin(o) ⇒ Object



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

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

#visit_Greater(o) ⇒ Object



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

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

#visit_GreaterOrEquals(o) ⇒ Object



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

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

#visit_GroupByClause(o) ⇒ Object



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

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

#visit_HavingClause(o) ⇒ Object



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

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

#visit_In(o) ⇒ Object



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

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

#visit_InColumnList(o) ⇒ Object



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

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

#visit_InnerJoin(o) ⇒ Object



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

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



339
340
341
# File 'lib/sql-parser/sql_visitor.rb', line 339

def visit_Integer(o)
  o.value.to_s
end

#visit_InValueList(o) ⇒ Object



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

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

#visit_Is(o) ⇒ Object



143
144
145
146
147
148
149
# File 'lib/sql-parser/sql_visitor.rb', line 143

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

#visit_LeftJoin(o) ⇒ Object



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

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

#visit_LeftOuterJoin(o) ⇒ Object



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

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

#visit_Less(o) ⇒ Object



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

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

#visit_LessOrEquals(o) ⇒ Object



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

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

#visit_Like(o) ⇒ Object



151
152
153
154
155
156
157
# File 'lib/sql-parser/sql_visitor.rb', line 151

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

#visit_Limit(o) ⇒ Object



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

def visit_Limit(o)
  "LIMIT #{o.limit_count}"
end

#visit_Maximum(o) ⇒ Object



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

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

#visit_Minimum(o) ⇒ Object



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

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

#visit_Multiply(o) ⇒ Object



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

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

#visit_Not(o) ⇒ Object



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

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

#visit_Null(o) ⇒ Object



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

def visit_Null(o)
  'NULL'
end

#visit_On(o) ⇒ Object



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

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

#visit_Or(o) ⇒ Object



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

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

#visit_OrderBy(o) ⇒ Object



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

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

#visit_OrderClause(o) ⇒ Object



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

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

#visit_QualifiedColumn(o) ⇒ Object



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

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

#visit_RightJoin(o) ⇒ Object



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

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

#visit_RightOuterJoin(o) ⇒ Object



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

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

#visit_Select(o) ⇒ Object



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

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



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

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

#visit_String(o) ⇒ Object



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

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

#visit_Subquery(o) ⇒ Object



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

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

#visit_Subtract(o) ⇒ Object



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

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

#visit_Sum(o) ⇒ Object



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

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

#visit_Table(o) ⇒ Object



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

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

#visit_TableExpression(o) ⇒ Object



82
83
84
85
86
87
88
89
# File 'lib/sql-parser/sql_visitor.rb', line 82

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



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

def visit_True(o)
  'TRUE'
end

#visit_UnaryMinus(o) ⇒ Object



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

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

#visit_UnaryPlus(o) ⇒ Object



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

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



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

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

#visit_WhereClause(o) ⇒ Object



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

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