pg_query 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +8 -2
- data/ext/pg_query/pg_query_parse.c +10 -4
- data/lib/pg_query/deparse.rb +273 -73
- data/lib/pg_query/parse.rb +1 -1
- data/lib/pg_query/parse_error.rb +2 -2
- data/lib/pg_query/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f75ea93d3521a2b9f912943357d6b16e3598bbea
|
4
|
+
data.tar.gz: f320d5689ceda9ba637d751bf10e4f09d8dddaae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2007ca5cea466541823b11818ba6ba9b86cdf447e3f449024a790b8ebfbf8a9762dfefc82e0e9abb6e96c42e5a3602c4c7bf7ed479aa431666f078f503911a7f
|
7
|
+
data.tar.gz: 687b67153015d9e3e36053a6ffc4e7c558cec3f4ca7eac3860188c0d88a72b41a38d57dcae0e02deb11535f3b8e2f499789fc1ad9281e1da8365c7d9a421e308
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.6.4 UNRELEASED
|
4
|
+
|
5
|
+
* ...
|
6
|
+
|
7
|
+
|
8
|
+
## 0.6.3 2015-08-20
|
9
|
+
|
10
|
+
* Deparsing
|
11
|
+
* COUNT(*) [@JackDanger](https://github.com/JackDanger)
|
12
|
+
* Window clauses [Chris Martin](https://github.com/cmrtn)
|
13
|
+
* CREATE TABLE/VIEW/FUNCTION [@JackDanger](https://github.com/JackDanger)
|
14
|
+
* Return exact location for parser errors [@JackDanger](https://github.com/JackDanger)
|
15
|
+
|
16
|
+
|
3
17
|
## 0.6.2 2015-08-06
|
4
18
|
|
5
19
|
* Speed up gem install by not generating rdoc/ri for the Postgres source
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# pg_query [ ](https://rubygems.org/gems/pg_query) [ ](https://rubygems.org/gems/pg_query) [ ](https://rubygems.org/gems/pg_query) [ ](https://rubygems.org/gems/pg_query) [ ](https://travis-ci.org/lfittl/pg_query)
|
2
2
|
|
3
3
|
This Ruby extension uses the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parsetree.
|
4
4
|
|
@@ -157,6 +157,7 @@ PgQuery.parse("SELECT 2; --- comment").fingerprint
|
|
157
157
|
**This gem uses a [patched version of the latest PostgreSQL stable](https://github.com/pganalyze/postgres/compare/REL9_4_STABLE...pg_query).**
|
158
158
|
|
159
159
|
Changes:
|
160
|
+
|
160
161
|
* **scan.l/gram.y:** Modified to support parsing normalized queries
|
161
162
|
* Known regression: Removed support for custom operators containing "?" (doesn't affect hstore/JSON/geometric operators)
|
162
163
|
* **outfuncs_json.c:** Auto-generated outfuncs that outputs a parsetree as JSON (called through nodeToJSONString)
|
@@ -164,11 +165,16 @@ Changes:
|
|
164
165
|
Unit tests for these patches are inside this library - the tests will break if run against upstream.
|
165
166
|
|
166
167
|
|
167
|
-
##
|
168
|
+
## Original Author
|
168
169
|
|
169
170
|
- [Lukas Fittl](mailto:lukas@fittl.com)
|
170
171
|
|
171
172
|
|
173
|
+
## Special Thanks to
|
174
|
+
|
175
|
+
- [Jack Danger Canty](https://github.com/JackDanger), for significantly improving deparsing
|
176
|
+
|
177
|
+
|
172
178
|
## License
|
173
179
|
|
174
180
|
Copyright (c) 2015, pganalyze Team <team@pganalyze.com><br>
|
@@ -10,15 +10,21 @@
|
|
10
10
|
VALUE new_parse_error(ErrorData* error)
|
11
11
|
{
|
12
12
|
VALUE cPgQuery, cParseError;
|
13
|
-
VALUE args[
|
13
|
+
VALUE args[4];
|
14
14
|
|
15
15
|
cPgQuery = rb_const_get(rb_cObject, rb_intern("PgQuery"));
|
16
16
|
cParseError = rb_const_get_at(cPgQuery, rb_intern("ParseError"));
|
17
17
|
|
18
|
+
// exception message
|
18
19
|
args[0] = rb_str_new2(error->message);
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
// source of exception (e.g. parse.l)
|
21
|
+
args[1] = rb_str_new2(error->filename);
|
22
|
+
// source of exception (e.g. 104)
|
23
|
+
args[2] = INT2NUM(error->lineno);
|
24
|
+
// char in query at which exception occurred
|
25
|
+
args[3] = INT2NUM(error->cursorpos);
|
26
|
+
|
27
|
+
return rb_class_new_instance(4, args, cParseError);
|
22
28
|
}
|
23
29
|
|
24
30
|
VALUE pg_query_raw_parse(VALUE self, VALUE input)
|
data/lib/pg_query/deparse.rb
CHANGED
@@ -22,80 +22,96 @@ class PgQuery
|
|
22
22
|
node = item.values[0]
|
23
23
|
|
24
24
|
case type
|
25
|
-
when '
|
26
|
-
|
25
|
+
when 'AEXPR AND'
|
26
|
+
deparse_aexpr_and(node)
|
27
|
+
when 'AEXPR ANY'
|
28
|
+
deparse_aexpr_any(node)
|
29
|
+
when 'AEXPR IN'
|
30
|
+
deparse_aexpr_in(node)
|
31
|
+
when 'AEXPR NOT'
|
32
|
+
deparse_aexpr_not(node)
|
33
|
+
when 'AEXPR OR'
|
34
|
+
deparse_aexpr_or(node)
|
27
35
|
when 'AEXPR'
|
28
36
|
deparse_aexpr(node)
|
29
|
-
when '
|
30
|
-
|
37
|
+
when 'ALIAS'
|
38
|
+
deparse_alias(node)
|
31
39
|
when 'A_ARRAYEXPR'
|
32
40
|
deparse_a_arrayexp(node)
|
33
41
|
when 'A_CONST'
|
34
42
|
deparse_a_const(node)
|
35
|
-
when 'A_STAR'
|
36
|
-
deparse_a_star(node)
|
37
|
-
when 'A_INDIRECTION'
|
38
|
-
deparse_a_indirection(node)
|
39
43
|
when 'A_INDICES'
|
40
44
|
deparse_a_indices(node)
|
41
|
-
when '
|
42
|
-
|
43
|
-
when '
|
44
|
-
|
45
|
-
when '
|
46
|
-
|
45
|
+
when 'A_INDIRECTION'
|
46
|
+
deparse_a_indirection(node)
|
47
|
+
when 'A_STAR'
|
48
|
+
deparse_a_star(node)
|
49
|
+
when 'A_TRUNCATED'
|
50
|
+
'...' # pg_query internal
|
51
|
+
when 'CASE'
|
52
|
+
deparse_case(node)
|
53
|
+
when 'COALESCE'
|
54
|
+
deparse_coalesce(node)
|
55
|
+
when 'COLUMNDEF'
|
56
|
+
deparse_columndef(node)
|
57
|
+
when 'COLUMNREF'
|
58
|
+
deparse_columnref(node)
|
59
|
+
when 'COMMONTABLEEXPR'
|
60
|
+
deparse_cte(node)
|
61
|
+
when 'CONSTRAINT'
|
62
|
+
deparse_constraint(node)
|
63
|
+
when 'CREATEFUNCTIONSTMT'
|
64
|
+
deparse_create_function(node)
|
65
|
+
when 'CREATESTMT'
|
66
|
+
deparse_create_table(node)
|
67
|
+
when 'DEFELEM'
|
68
|
+
deparse_defelem(node)
|
69
|
+
when 'DELETE FROM'
|
70
|
+
deparse_delete_from(node)
|
47
71
|
when 'FUNCCALL'
|
48
72
|
deparse_funccall(node)
|
49
|
-
when '
|
50
|
-
|
51
|
-
when '
|
52
|
-
|
73
|
+
when 'FUNCTIONPARAMETER'
|
74
|
+
deparse_functionparameter(node)
|
75
|
+
when 'INSERT INTO'
|
76
|
+
deparse_insert_into(node)
|
53
77
|
when 'JOINEXPR'
|
54
78
|
deparse_joinexpr(node)
|
55
|
-
when '
|
56
|
-
|
79
|
+
when 'NULLTEST'
|
80
|
+
deparse_nulltest(node)
|
81
|
+
when 'PARAMREF'
|
82
|
+
deparse_paramref(node)
|
83
|
+
when 'RANGEFUNCTION'
|
84
|
+
deparse_range_function(node)
|
85
|
+
when 'RANGESUBSELECT'
|
86
|
+
deparse_rangesubselect(node)
|
87
|
+
when 'RANGEVAR'
|
88
|
+
deparse_rangevar(node)
|
89
|
+
when 'RESTARGET'
|
90
|
+
deparse_restarget(node, context)
|
91
|
+
when 'ROW'
|
92
|
+
deparse_row(node)
|
57
93
|
when 'SELECT'
|
58
94
|
deparse_select(node)
|
59
|
-
when '
|
60
|
-
|
61
|
-
when '
|
62
|
-
|
63
|
-
when '
|
64
|
-
|
65
|
-
when 'UPDATE'
|
66
|
-
deparse_update(node)
|
95
|
+
when 'SORTBY'
|
96
|
+
deparse_sortby(node)
|
97
|
+
when 'SUBLINK'
|
98
|
+
deparse_sublink(node)
|
99
|
+
when 'TRANSACTION'
|
100
|
+
deparse_transaction(node)
|
67
101
|
when 'TYPECAST'
|
68
102
|
deparse_typecast(node)
|
69
103
|
when 'TYPENAME'
|
70
104
|
deparse_typename(node)
|
71
|
-
when '
|
72
|
-
|
105
|
+
when 'UPDATE'
|
106
|
+
deparse_update(node)
|
73
107
|
when 'WHEN'
|
74
108
|
deparse_when(node)
|
75
|
-
when '
|
76
|
-
|
77
|
-
when '
|
78
|
-
|
79
|
-
when '
|
80
|
-
|
81
|
-
when 'AEXPR IN'
|
82
|
-
deparse_aexpr_in(node)
|
83
|
-
when 'AEXPR NOT'
|
84
|
-
deparse_aexpr_not(node)
|
85
|
-
when 'AEXPR OR'
|
86
|
-
deparse_aexpr_or(node)
|
87
|
-
when 'AEXPR ANY'
|
88
|
-
deparse_aexpr_any(node)
|
89
|
-
when 'NULLTEST'
|
90
|
-
deparse_nulltest(node)
|
91
|
-
when 'TRANSACTION'
|
92
|
-
deparse_transaction(node)
|
93
|
-
when 'COALESCE'
|
94
|
-
deparse_coalesce(node)
|
95
|
-
when 'DELETE FROM'
|
96
|
-
deparse_delete_from(node)
|
97
|
-
when 'A_TRUNCATED'
|
98
|
-
'...' # pg_query internal
|
109
|
+
when 'WINDOWDEF'
|
110
|
+
deparse_windowdef(node)
|
111
|
+
when 'WITHCLAUSE'
|
112
|
+
deparse_with_clause(node)
|
113
|
+
when 'VIEWSTMT'
|
114
|
+
deparse_viewstmt(node)
|
99
115
|
else
|
100
116
|
fail format("Can't deparse: %s: %s", type, node.inspect)
|
101
117
|
end
|
@@ -122,7 +138,7 @@ class PgQuery
|
|
122
138
|
end
|
123
139
|
|
124
140
|
def deparse_a_const(node)
|
125
|
-
node['val'].inspect.gsub('"
|
141
|
+
node['val'].inspect.gsub("'", "''").gsub('"', "'")
|
126
142
|
end
|
127
143
|
|
128
144
|
def deparse_a_star(_node)
|
@@ -142,7 +158,12 @@ class PgQuery
|
|
142
158
|
end
|
143
159
|
|
144
160
|
def deparse_alias(node)
|
145
|
-
node['aliasname']
|
161
|
+
name = node['aliasname']
|
162
|
+
if node['colnames']
|
163
|
+
name + '(' + node['colnames'].join(', ') + ')'
|
164
|
+
else
|
165
|
+
name
|
166
|
+
end
|
146
167
|
end
|
147
168
|
|
148
169
|
def deparse_paramref(node)
|
@@ -166,8 +187,41 @@ class PgQuery
|
|
166
187
|
end
|
167
188
|
|
168
189
|
def deparse_funccall(node)
|
190
|
+
output = []
|
191
|
+
|
192
|
+
# SUM(a, b)
|
169
193
|
args = Array(node['args']).map { |arg| deparse_item(arg) }
|
170
|
-
|
194
|
+
# COUNT(*)
|
195
|
+
args << '*' if node['agg_star']
|
196
|
+
|
197
|
+
output << format('%s(%s)', node['funcname'].join('.'), args.join(', '))
|
198
|
+
output << format('OVER (%s)', deparse_item(node['over'])) if node['over']
|
199
|
+
|
200
|
+
output.join(' ')
|
201
|
+
end
|
202
|
+
|
203
|
+
def deparse_windowdef(node)
|
204
|
+
output = []
|
205
|
+
|
206
|
+
if node['partitionClause']
|
207
|
+
output << 'PARTITION BY'
|
208
|
+
output << node['partitionClause'].map do |item|
|
209
|
+
deparse_item(item)
|
210
|
+
end.join(', ')
|
211
|
+
end
|
212
|
+
|
213
|
+
if node['orderClause']
|
214
|
+
output << 'ORDER BY'
|
215
|
+
output << node['orderClause'].map do |item|
|
216
|
+
deparse_item(item)
|
217
|
+
end.join(', ')
|
218
|
+
end
|
219
|
+
|
220
|
+
output.join(' ')
|
221
|
+
end
|
222
|
+
|
223
|
+
def deparse_functionparameter(node)
|
224
|
+
deparse_item(node['argType'])
|
171
225
|
end
|
172
226
|
|
173
227
|
def deparse_aexpr_in(node)
|
@@ -234,6 +288,7 @@ class PgQuery
|
|
234
288
|
output = []
|
235
289
|
output << deparse_item(node['node'])
|
236
290
|
output << 'ASC' if node['sortby_dir'] == 1
|
291
|
+
output << 'DESC' if node['sortby_dir'] == 2
|
237
292
|
output.join(' ')
|
238
293
|
end
|
239
294
|
|
@@ -246,12 +301,36 @@ class PgQuery
|
|
246
301
|
output.join(' ')
|
247
302
|
end
|
248
303
|
|
304
|
+
def deparse_viewstmt(node)
|
305
|
+
output = []
|
306
|
+
output << 'CREATE'
|
307
|
+
output << 'OR REPLACE' if node['replace']
|
308
|
+
|
309
|
+
persistence = relpersistence(node['view'])
|
310
|
+
output << persistence if persistence
|
311
|
+
|
312
|
+
output << 'VIEW'
|
313
|
+
output << node['view']['RANGEVAR']['relname']
|
314
|
+
output << format('(%s)', node['aliases'].join(', ')) if node['aliases']
|
315
|
+
|
316
|
+
output << 'AS'
|
317
|
+
output << deparse_item(node['query'])
|
318
|
+
|
319
|
+
case node['withCheckOption']
|
320
|
+
when 1
|
321
|
+
output << 'WITH CHECK OPTION'
|
322
|
+
when 2
|
323
|
+
output << 'WITH CASCADED CHECK OPTION'
|
324
|
+
end
|
325
|
+
output.join(' ')
|
326
|
+
end
|
327
|
+
|
249
328
|
def deparse_cte(node)
|
250
|
-
output =
|
251
|
-
output
|
252
|
-
output
|
253
|
-
output
|
254
|
-
output
|
329
|
+
output = []
|
330
|
+
output << node['ctename']
|
331
|
+
output << format('(%s)', node['aliascolnames'].join(', ')) if node['aliascolnames']
|
332
|
+
output << format('AS (%s)', deparse_item(node['ctequery']))
|
333
|
+
output.join(' ')
|
255
334
|
end
|
256
335
|
|
257
336
|
def deparse_case(node)
|
@@ -265,6 +344,65 @@ class PgQuery
|
|
265
344
|
output.join(' ')
|
266
345
|
end
|
267
346
|
|
347
|
+
def deparse_columndef(node)
|
348
|
+
output = [node['colname']]
|
349
|
+
output << deparse_item(node['typeName'])
|
350
|
+
if node['constraints']
|
351
|
+
output += node['constraints'].map do |item|
|
352
|
+
deparse_item(item)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
output.join(' ')
|
356
|
+
end
|
357
|
+
|
358
|
+
def deparse_constraint(node)
|
359
|
+
output = []
|
360
|
+
# NOT_NULL -> NOT NULL
|
361
|
+
output << node['contype'].gsub('_', ' ')
|
362
|
+
output << deparse_item(node['raw_expr']) if node['raw_expr']
|
363
|
+
output.join(' ')
|
364
|
+
end
|
365
|
+
|
366
|
+
def deparse_create_function(node)
|
367
|
+
output = []
|
368
|
+
output << 'CREATE FUNCTION'
|
369
|
+
|
370
|
+
arguments = node['parameters'].map { |item| deparse_item(item) }.join(', ')
|
371
|
+
|
372
|
+
output << node['funcname'].first + '(' + arguments + ')'
|
373
|
+
|
374
|
+
output << 'RETURNS'
|
375
|
+
output << deparse_item(node['returnType'])
|
376
|
+
output += node['options'].map { |item| deparse_item(item) }
|
377
|
+
|
378
|
+
output.join(' ')
|
379
|
+
end
|
380
|
+
|
381
|
+
def deparse_create_table(node)
|
382
|
+
output = []
|
383
|
+
output << 'CREATE'
|
384
|
+
|
385
|
+
persistence = relpersistence(node['relation'])
|
386
|
+
output << persistence if persistence
|
387
|
+
|
388
|
+
output << 'TABLE'
|
389
|
+
|
390
|
+
output << deparse_item(node['relation'])
|
391
|
+
|
392
|
+
output << '(' + node['tableElts'].map do |item|
|
393
|
+
deparse_item(item)
|
394
|
+
end.join(', ') + ')'
|
395
|
+
|
396
|
+
if node['inhRelations']
|
397
|
+
output << 'INHERITS'
|
398
|
+
output << '(' + node['inhRelations'].map do |relation|
|
399
|
+
deparse_item(relation)
|
400
|
+
end.join(', ') + ')'
|
401
|
+
end
|
402
|
+
|
403
|
+
output.join(' ')
|
404
|
+
end
|
405
|
+
|
268
406
|
def deparse_when(node)
|
269
407
|
output = ['WHEN']
|
270
408
|
output << deparse_item(node['expr'])
|
@@ -284,11 +422,12 @@ class PgQuery
|
|
284
422
|
end
|
285
423
|
|
286
424
|
def deparse_rangesubselect(node)
|
287
|
-
output = '('
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
425
|
+
output = '(' + deparse_item(node['subquery']) + ')'
|
426
|
+
if node['alias']
|
427
|
+
output + ' ' + deparse_item(node['alias'])
|
428
|
+
else
|
429
|
+
output
|
430
|
+
end
|
292
431
|
end
|
293
432
|
|
294
433
|
def deparse_row(node)
|
@@ -400,7 +539,7 @@ class PgQuery
|
|
400
539
|
end
|
401
540
|
|
402
541
|
def deparse_typecast(node)
|
403
|
-
if deparse_item(node['typeName']) ==
|
542
|
+
if deparse_item(node['typeName']) == 'boolean'
|
404
543
|
deparse_item(node['arg']) == "'t'" ? 'true' : 'false'
|
405
544
|
else
|
406
545
|
deparse_item(node['arg']) + '::' + deparse_typename(node['typeName']['TYPENAME'])
|
@@ -408,10 +547,50 @@ class PgQuery
|
|
408
547
|
end
|
409
548
|
|
410
549
|
def deparse_typename(node)
|
411
|
-
|
412
|
-
|
550
|
+
output = []
|
551
|
+
output << 'SETOF' if node['setof']
|
552
|
+
|
553
|
+
if node['typmods']
|
554
|
+
arguments = node['typmods'].map do |item|
|
555
|
+
deparse_item(item)
|
556
|
+
end.join(', ')
|
557
|
+
end
|
558
|
+
|
559
|
+
output << deparse_typename_cast(node['names'], arguments)
|
560
|
+
|
561
|
+
output.join(' ')
|
562
|
+
end
|
563
|
+
|
564
|
+
def deparse_typename_cast(names, arguments) # rubocop:disable Metrics/CyclomaticComplexity
|
565
|
+
catalog, type = names
|
566
|
+
# Just pass along any custom types.
|
567
|
+
# (The pg_catalog types are built-in Postgres system types and are
|
568
|
+
# handled in the case statement below)
|
569
|
+
return names.join('.') if catalog != 'pg_catalog'
|
570
|
+
|
571
|
+
case type
|
572
|
+
when 'bpchar'
|
573
|
+
# char(2) or char(9)
|
574
|
+
"char(#{arguments})"
|
575
|
+
when 'varchar'
|
576
|
+
"varchar(#{arguments})"
|
577
|
+
when 'numeric'
|
578
|
+
# numeric(3, 5)
|
579
|
+
"numeric(#{arguments})"
|
580
|
+
when 'bool'
|
581
|
+
'boolean'
|
582
|
+
when 'int2'
|
583
|
+
'smallint'
|
584
|
+
when 'int4'
|
585
|
+
'int'
|
586
|
+
when 'int8'
|
587
|
+
'bigint'
|
588
|
+
when 'real', 'float4'
|
589
|
+
'real'
|
590
|
+
when 'float8'
|
591
|
+
'double'
|
413
592
|
else
|
414
|
-
|
593
|
+
fail format("Can't deparse type: %s", type)
|
415
594
|
end
|
416
595
|
end
|
417
596
|
|
@@ -437,8 +616,8 @@ class PgQuery
|
|
437
616
|
output = []
|
438
617
|
output << TRANSACTION_CMDS[node['kind']] || fail(format("Can't deparse TRANSACTION %s", node.inspect))
|
439
618
|
|
440
|
-
if node['options']
|
441
|
-
output
|
619
|
+
if node['options']
|
620
|
+
output += node['options'].map { |item| deparse_item(item) }
|
442
621
|
end
|
443
622
|
|
444
623
|
output.join(' ')
|
@@ -448,6 +627,17 @@ class PgQuery
|
|
448
627
|
format('COALESCE(%s)', node['args'].map { |a| deparse_item(a) }.join(', '))
|
449
628
|
end
|
450
629
|
|
630
|
+
def deparse_defelem(node)
|
631
|
+
case node['defname']
|
632
|
+
when 'as'
|
633
|
+
"AS $$#{node['arg'].join("\n")}$$"
|
634
|
+
when 'language'
|
635
|
+
"language #{node['arg']}"
|
636
|
+
else
|
637
|
+
node['arg']
|
638
|
+
end
|
639
|
+
end
|
640
|
+
|
451
641
|
def deparse_delete_from(node)
|
452
642
|
output = []
|
453
643
|
output << deparse_item(node['withClause']) if node['withClause']
|
@@ -477,5 +667,15 @@ class PgQuery
|
|
477
667
|
|
478
668
|
output.join(' ')
|
479
669
|
end
|
670
|
+
|
671
|
+
# The PG parser adds several pieces of view data onto the RANGEVAR
|
672
|
+
# that need to be printed before deparse_rangevar is called.
|
673
|
+
def relpersistence(rangevar)
|
674
|
+
if rangevar['RANGEVAR']['relpersistence'] == 't'
|
675
|
+
'TEMPORARY'
|
676
|
+
elsif rangevar['RANGEVAR']['relpersistence'] == 'u'
|
677
|
+
'UNLOGGED'
|
678
|
+
end
|
679
|
+
end
|
480
680
|
end
|
481
681
|
end
|
data/lib/pg_query/parse.rb
CHANGED
data/lib/pg_query/parse_error.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
class PgQuery
|
2
2
|
class ParseError < ArgumentError
|
3
3
|
attr_reader :location
|
4
|
-
def initialize(message, location)
|
5
|
-
super(message)
|
4
|
+
def initialize(message, source_file, source_line, location)
|
5
|
+
super("#{message} (#{source_file}:#{source_line})")
|
6
6
|
@location = location
|
7
7
|
end
|
8
8
|
end
|
data/lib/pg_query/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukas Fittl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|