pg_query 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/pg_query.rb +2 -1
- data/lib/pg_query/parse_normalized.rb +51 -0
- data/lib/pg_query/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZWQ2ODM2MzRjNWVkODM4ZWJhMjliN2Y1Yjg4NzE4MzljYmUzM2ZkYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MDMwMjdmODc1MjM1YzAwMTZhNDg4ZDk2Y2YxMjVhZWMzOGNlODNmNw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTAzODFhNjEyNWJmNmVhNzIxNGYwYWMzZWY0ZGE3YTAzOWYzOTMzZmVjZTA5
|
10
|
+
YWUyMGViNTgxMGIzOGU3NjRmZDMyZmUwMDBlNDUxMmZiYmYwZTMzNGY1MzE1
|
11
|
+
M2M3YTU3NGJkY2Y2N2I0NDI1NzIzZTEzY2ZlYTAyZWFiNTFmNGQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZWI2YzI0Mjc5NzIzMDU1MGJiNzIyNzIzMGI1Y2UwMmI1MGE4NTk5ZThjYjE4
|
14
|
+
YTliZTkxMDM3MjM2OGQxODZjY2JhZGZkYTNkNWQ1MjMwNGVlMGM4OWEyMzc0
|
15
|
+
YTk4NmRmOTRmOTc0ZTJjOTQ3NDZiMGQxNGYxYjVkMWYzNzIyZWE=
|
data/lib/pg_query.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
class PgQuery
|
2
|
+
# Parses a query that has been normalized by pg_stat_statements
|
3
|
+
def self.parse_normalized(original_query)
|
4
|
+
# Transform ? into \uFFED
|
5
|
+
query = normalized_to_parseable_query(original_query)
|
6
|
+
|
7
|
+
# Parse it!
|
8
|
+
result = parse(query)
|
9
|
+
|
10
|
+
# Transform \uFFED references as if they were $0
|
11
|
+
parsed_to_normalized_parsetree!(result.parsetree)
|
12
|
+
|
13
|
+
PgQuery.new(original_query, result.parsetree, result.warnings)
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
# The PostgreSQL parser doesn't understand pg_stat_statements replacement characters,
|
18
|
+
# change them into a fake column reference to an unusual unicode character \uFFED
|
19
|
+
def self.normalized_to_parseable_query(query)
|
20
|
+
regexps = [
|
21
|
+
'INTERVAL ?',
|
22
|
+
/\$[0-9]+\?/,
|
23
|
+
'?.?',
|
24
|
+
/(?<!\\)\?/, # Replace all ?, unless they are escaped by a backslash
|
25
|
+
]
|
26
|
+
regexps.each do |re|
|
27
|
+
query = query.gsub(re) {|m| "\uFFED" * m.size }
|
28
|
+
end
|
29
|
+
query
|
30
|
+
end
|
31
|
+
|
32
|
+
# Modifies the passed in parsetree to have paramrefs to $0 instead of columnref to \uFFED
|
33
|
+
def self.parsed_to_normalized_parsetree!(parsetree)
|
34
|
+
expressions = parsetree.dup
|
35
|
+
loop do
|
36
|
+
break unless expression = expressions.shift
|
37
|
+
|
38
|
+
if expression.is_a?(Array)
|
39
|
+
expressions += expression.compact
|
40
|
+
elsif expression.is_a?(Hash)
|
41
|
+
value = expression['COLUMNREF'] && expression['COLUMNREF']['fields']
|
42
|
+
if value && value.size == 1 && value[0].is_a?(String) && value[0].chars.to_a.uniq == ["\uFFED"]
|
43
|
+
expression.replace('PARAMREF' => {'number' => 0,
|
44
|
+
'location' => expression['COLUMNREF']['location']})
|
45
|
+
else
|
46
|
+
expressions += expression.values.compact
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/pg_query/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukas Fittl
|
@@ -67,6 +67,7 @@ files:
|
|
67
67
|
- lib/pg_query.rb
|
68
68
|
- lib/pg_query/parse.rb
|
69
69
|
- lib/pg_query/parse_error.rb
|
70
|
+
- lib/pg_query/parse_normalized.rb
|
70
71
|
- lib/pg_query/version.rb
|
71
72
|
homepage: http://github.com/pganalyze/pg_query
|
72
73
|
licenses:
|