pg_query 0.2.7 → 0.2.8
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 +13 -5
- data/lib/pg_query/parse.rb +92 -0
- data/lib/pg_query/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YzUxOGE4ZjRmZjRhYTk3MGI5NzBkMzI5OWFiMWIzNWViZGIzZWJiOA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZmY3NmRhMDczMDYwODZlM2FmNzMwNmY1Nzc5YjM2YWU4MTQ1YTUxZg==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MWJjMzhhZWIyMGViNjY3ODJmZmRjYzYyNWZkMThhNjhhOWJhYTcxZWM3Yzlj
|
10
|
+
YTAwZGUyYWZmZTJhMThhMmE1Y2MzNjEzMTA2NDhhODI1MjU1Y2JlMTk5MzY3
|
11
|
+
ZGNhZDVkZGJiODlkZWUyZjI0MzcwZDBlYWM0OGU3ZDRlZmYzZGM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MTdiN2M0NmFhMDBlZTA5Y2I5Yzc4ZWRiNGEzZGVlNjlmNDA0OGE3NmFmMzYx
|
14
|
+
MDY1MThjYWRjMDBiYWRlYTg2NWEyMWFhMTU5ZDMyNTBhOWY3NDBkZWJlZTkz
|
15
|
+
YzYxN2FlOWIxZDExMzdkNGZhYjE5MjNlMzIzODVmOGRjMDhjZDg=
|
data/lib/pg_query/parse.rb
CHANGED
@@ -27,4 +27,96 @@ class PgQuery
|
|
27
27
|
@parsetree = parsetree
|
28
28
|
@warnings = warnings
|
29
29
|
end
|
30
|
+
|
31
|
+
def tables
|
32
|
+
load_tables_and_aliases! if @tables.nil?
|
33
|
+
@tables
|
34
|
+
end
|
35
|
+
|
36
|
+
def aliases
|
37
|
+
load_tables_and_aliases! if @aliases.nil?
|
38
|
+
@aliases
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
def load_tables_and_aliases!
|
43
|
+
@tables = []
|
44
|
+
@aliases = {}
|
45
|
+
|
46
|
+
statements = @parsetree.dup
|
47
|
+
from_clause_items = []
|
48
|
+
where_clause_items = []
|
49
|
+
|
50
|
+
loop do
|
51
|
+
if statement = statements.shift
|
52
|
+
case statement.keys[0]
|
53
|
+
when "SELECT"
|
54
|
+
if statement["SELECT"]["op"] == 0
|
55
|
+
(statement["SELECT"]["fromClause"] || []).each do |item|
|
56
|
+
if item["RANGESUBSELECT"]
|
57
|
+
statements << item["RANGESUBSELECT"]["subquery"]
|
58
|
+
else
|
59
|
+
from_clause_items << item
|
60
|
+
end
|
61
|
+
end
|
62
|
+
elsif statement["SELECT"]["op"] == 1
|
63
|
+
statements << statement["SELECT"]["larg"] if statement["SELECT"]["larg"]
|
64
|
+
statements << statement["SELECT"]["rarg"] if statement["SELECT"]["rarg"]
|
65
|
+
end
|
66
|
+
when "INSERT INTO", "UPDATE", "DELETE FROM", "VACUUM", "COPY", "ALTER TABLE"
|
67
|
+
from_clause_items << statement.values[0]["relation"]
|
68
|
+
when "EXPLAIN"
|
69
|
+
statements << statement["EXPLAIN"]["query"]
|
70
|
+
when "CREATE TABLE AS"
|
71
|
+
from_clause_items << statement["CREATE TABLE AS"]["into"]["INTOCLAUSE"]["rel"] rescue nil
|
72
|
+
when "LOCK"
|
73
|
+
from_clause_items += statement["LOCK"]["relations"]
|
74
|
+
when "DROP"
|
75
|
+
object_type = statement["DROP"]["removeType"]
|
76
|
+
@tables += statement["DROP"]["objects"].map {|r| r.join('.') } if object_type == 26 # Table
|
77
|
+
end
|
78
|
+
|
79
|
+
where_clause_items << statement.values[0]["whereClause"] if !statement.empty? && statement.values[0]["whereClause"]
|
80
|
+
end
|
81
|
+
|
82
|
+
# Find subselects in WHERE clause
|
83
|
+
if next_item = where_clause_items.shift
|
84
|
+
case next_item.keys[0]
|
85
|
+
when /^AEXPR/, 'ANY'
|
86
|
+
["lexpr", "rexpr"].each do |side|
|
87
|
+
next unless elem = next_item.values[0][side]
|
88
|
+
if elem.is_a?(Array)
|
89
|
+
where_clause_items += elem
|
90
|
+
else
|
91
|
+
where_clause_items << elem
|
92
|
+
end
|
93
|
+
end
|
94
|
+
when 'SUBLINK'
|
95
|
+
statements << next_item["SUBLINK"]["subselect"]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
break if where_clause_items.empty? && statements.empty?
|
100
|
+
end
|
101
|
+
|
102
|
+
loop do
|
103
|
+
break unless next_item = from_clause_items.shift
|
104
|
+
|
105
|
+
case next_item.keys[0]
|
106
|
+
when "JOINEXPR"
|
107
|
+
["larg", "rarg"].each do |side|
|
108
|
+
from_clause_items << next_item["JOINEXPR"][side]
|
109
|
+
end
|
110
|
+
when "ROW"
|
111
|
+
from_clause_items += next_item["ROW"]["args"]
|
112
|
+
when "RANGEVAR"
|
113
|
+
rangevar = next_item["RANGEVAR"]
|
114
|
+
table = [rangevar["schemaname"], rangevar["relname"]].compact.join('.')
|
115
|
+
@tables << table
|
116
|
+
@aliases[rangevar["alias"]["ALIAS"]["aliasname"]] = table if rangevar["alias"]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
@tables.uniq!
|
121
|
+
end
|
30
122
|
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.2.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukas Fittl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -78,12 +78,12 @@ require_paths:
|
|
78
78
|
- lib
|
79
79
|
required_ruby_version: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- - '>='
|
81
|
+
- - ! '>='
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
|
-
- - '>='
|
86
|
+
- - ! '>='
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '0'
|
89
89
|
requirements: []
|