pg_query 2.2.0 → 2.2.1
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 +5 -0
- data/README.md +32 -0
- data/lib/pg_query/parse.rb +5 -3
- data/lib/pg_query/treewalker.rb +6 -0
- data/lib/pg_query/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9625ed6fd4d8f67673ee922f191996d2c157addf6d97aa092af682a21bf96ce7
|
4
|
+
data.tar.gz: 9a20dedc0420e5a7f2162c642c2ddee60cd98fd6bbfeff1b1affc181f6dcbc27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f4633dd45e1530cebc92731315a238f22e4111ba23e10ea6991b6466f444ce2b974ffd858aaf5c93c5b6597e004e0b2334ac1832c24851956e34dd629fe58ff
|
7
|
+
data.tar.gz: 36d225dc15a58db4336cdbdd571a385308403b93d5507ec25b0deb5179be87b8a00fb029b1e5b77bdf62f79861fedd39ba350a50897bcfec4d61e266b2cdf639
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,11 @@
|
|
4
4
|
|
5
5
|
* ...
|
6
6
|
|
7
|
+
## 2.2.1 2022-01-20
|
8
|
+
|
9
|
+
* Detect tables used in the query of a PREPARE statement ([#273](https://github.com/pganalyze/pg_query/pull/273))
|
10
|
+
* Expose recursive walk functionality via walk! ([#268](https://github.com/pganalyze/pg_query/pull/268))
|
11
|
+
* Retain schema in name when parsing out functions ([#272](https://github.com/pganalyze/pg_query/pull/272))
|
7
12
|
|
8
13
|
## 2.2.0 2022-11-02
|
9
14
|
|
data/README.md
CHANGED
@@ -72,6 +72,8 @@ PgQuery.parse("SELECT 1")
|
|
72
72
|
|
73
73
|
### Modifying a parsed query and turning it into SQL again
|
74
74
|
|
75
|
+
This is a simple example for `deparse`, for more complex modification, use `walk!`.
|
76
|
+
|
75
77
|
```ruby
|
76
78
|
parsed_query = PgQuery.parse("SELECT * FROM users")
|
77
79
|
|
@@ -145,6 +147,36 @@ PgQuery.scan('SELECT 1 --comment')
|
|
145
147
|
[]]
|
146
148
|
```
|
147
149
|
|
150
|
+
### Walking the parse tree
|
151
|
+
|
152
|
+
For generalized use, PgQuery provides `walk!` as a means to recursively work with the parsed query.
|
153
|
+
|
154
|
+
This can be used to create a bespoke pretty printer:
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
parsed_query = PgQuery.parse "SELECT * FROM tbl"
|
158
|
+
parsed_query.walk! { |node, k, v, location| puts k }
|
159
|
+
```
|
160
|
+
|
161
|
+
More usefully, this can be used to rewrite a query. For example:
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
parsed_query.walk! do |node, k, v, location| puts k
|
165
|
+
next unless k.eql?(:range_var) || k.eql?(:relation)
|
166
|
+
next if v.relname.nil?
|
167
|
+
v.relname = "X_" + v.relname
|
168
|
+
end
|
169
|
+
|
170
|
+
parsed_query.deparse
|
171
|
+
```
|
172
|
+
|
173
|
+
There are some caveats, and limitations, in this example.
|
174
|
+
|
175
|
+
First, some of the tree nodes are frozen. You can replace them, but you cannot modify in place.
|
176
|
+
|
177
|
+
Second, table rewriting is a bit more nuanced than this example. While this will rewrite the table names, it will
|
178
|
+
not correctly handle all CTEs, or rewrite columns with explicit table names.
|
179
|
+
|
148
180
|
## Differences from Upstream PostgreSQL
|
149
181
|
|
150
182
|
This gem is based on [libpg_query](https://github.com/pganalyze/libpg_query),
|
data/lib/pg_query/parse.rb
CHANGED
@@ -216,7 +216,7 @@ module PgQuery
|
|
216
216
|
when :OBJECT_FUNCTION
|
217
217
|
# Only one function can be dropped in a statement
|
218
218
|
obj = statement.drop_stmt.objects[0].object_with_args
|
219
|
-
@functions << { function: obj.objname
|
219
|
+
@functions << { function: obj.objname.map { |f| f.string.str }.join('.'), type: :ddl }
|
220
220
|
end
|
221
221
|
when :grant_stmt
|
222
222
|
objects = statement.grant_stmt.objects
|
@@ -235,18 +235,20 @@ module PgQuery
|
|
235
235
|
statements << statement.explain_stmt.query
|
236
236
|
when :create_function_stmt
|
237
237
|
@functions << {
|
238
|
-
function: statement.create_function_stmt.funcname
|
238
|
+
function: statement.create_function_stmt.funcname.map { |f| f.string.str }.join('.'),
|
239
239
|
type: :ddl
|
240
240
|
}
|
241
241
|
when :rename_stmt
|
242
242
|
if statement.rename_stmt.rename_type == :OBJECT_FUNCTION
|
243
|
-
original_name = statement.rename_stmt.object.object_with_args.objname
|
243
|
+
original_name = statement.rename_stmt.object.object_with_args.objname.map { |f| f.string.str }.join('.')
|
244
244
|
new_name = statement.rename_stmt.newname
|
245
245
|
@functions += [
|
246
246
|
{ function: original_name, type: :ddl },
|
247
247
|
{ function: new_name, type: :ddl }
|
248
248
|
]
|
249
249
|
end
|
250
|
+
when :prepare_stmt
|
251
|
+
statements << statement.prepare_stmt.query
|
250
252
|
end
|
251
253
|
end
|
252
254
|
|
data/lib/pg_query/treewalker.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
module PgQuery
|
2
2
|
class ParserResult
|
3
|
+
def walk!
|
4
|
+
treewalker!(@tree) do |parent_node, parent_field, node, location|
|
5
|
+
yield(parent_node, parent_field, node, location)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
3
9
|
private
|
4
10
|
|
5
11
|
def treewalker!(tree) # rubocop:disable Metrics/CyclomaticComplexity
|
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: 2.2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukas Fittl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -585,7 +585,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
585
585
|
- !ruby/object:Gem::Version
|
586
586
|
version: '0'
|
587
587
|
requirements: []
|
588
|
-
rubygems_version: 3.
|
588
|
+
rubygems_version: 3.0.3
|
589
589
|
signing_key:
|
590
590
|
specification_version: 4
|
591
591
|
summary: PostgreSQL query parsing and normalization library
|