Skip to content

Commit

Permalink
Not adding parentheses where not needed.
Browse files Browse the repository at this point in the history
  • Loading branch information
JackDanger committed Aug 25, 2015
1 parent ef735f4 commit 80a7c60
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 13 deletions.
25 changes: 18 additions & 7 deletions lib/pg_query/deparse.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def deparse_item(item, context = nil) # rubocop:disable Metrics/CyclomaticComple
when 'AEXPR OR'
deparse_aexpr_or(node)
when 'AEXPR'
deparse_aexpr(node)
deparse_aexpr(node, context)
when 'ALIAS'
deparse_alias(node)
when 'ALTER TABLE'
Expand Down Expand Up @@ -248,7 +248,8 @@ def deparse_funccall(node)
# COUNT(*)
args << '*' if node['agg_star']

output << format('%s(%s)', node['funcname'].join('.'), args.join(', '))
name = (node['funcname'] - ['pg_catalog']).join('.')
output << format('%s(%s)', name, args.join(', '))
output << format('OVER (%s)', deparse_item(node['over'])) if node['over']

output.join(' ')
Expand Down Expand Up @@ -295,11 +296,16 @@ def deparse_range_function(node)
output.join(' ')
end

def deparse_aexpr(node)
def deparse_aexpr(node, context = false)
output = []
output << deparse_item(node['lexpr'])
output << deparse_item(node['rexpr'])
output.join(' ' + node['name'][0] + ' ')
output << deparse_item(node['lexpr'], context || true)
output << deparse_item(node['rexpr'], context || true)
output = output.join(' ' + node['name'][0] + ' ')
if context
# This is a nested expression, add parentheses.
output = '(' + output + ')'
end
output
end

def deparse_aexpr_and(node)
Expand Down Expand Up @@ -422,7 +428,12 @@ def deparse_constraint(node)
# NOT_NULL -> NOT NULL
output << node['contype'].gsub('_', ' ')

output << '(' + deparse_item(node['raw_expr']) + ')' if node['raw_expr']
if node['raw_expr']
expression = deparse_item(node['raw_expr'])
# Unless it's simple, put parentheses around it
expression = '(' + expression + ')' if node['raw_expr'].keys == ['AEXPR']
output << expression
end
output << '(' + node['keys'].join(', ') + ')' if node['keys']
output << "USING INDEX #{node['indexname']}" if node['indexname']
output.join(' ')
Expand Down
28 changes: 22 additions & 6 deletions spec/lib/pg_query/deparse_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,22 @@
end
it { is_expected.to eq oneline_query }
end

context 'from generated sequence' do
let(:query) do
"""
INSERT INTO jackdanger_card_totals (id, amount_cents, created_at)
SELECT
series.i,
random() * 1000,
(SELECT
'2015-08-25 00:00:00 -0700'::timestamp +
(('2015-08-25 23:59:59 -0700'::timestamp - '2015-08-25 00:00:00 -0700'::timestamp) * random()))
FROM generate_series(1, 10000) series(i);
"""
end
it { is_expected.to eq oneline_query }
end
end

context 'DELETE' do
Expand Down Expand Up @@ -326,11 +342,11 @@
let(:query) do
"""
CREATE TABLE distributors (
name varchar(40) DEFAULT ('Luso Films'),
name varchar(40) DEFAULT 'Luso Films',
len interval hour to second(3),
name varchar(40) DEFAULT ('Luso Films'),
did int DEFAULT (nextval('distributors_serial')),
stamp timestamp DEFAULT (pg_catalog.now()) NOT NULL,
name varchar(40) DEFAULT 'Luso Films',
did int DEFAULT nextval('distributors_serial'),
stamp timestamp DEFAULT now() NOT NULL,
stamptz timestamp with time zone,
time time NOT NULL,
timetz time with time zone,
Expand Down Expand Up @@ -358,7 +374,7 @@
let(:query) do
"""
CREATE TABLE tablename (
colname int NOT NULL DEFAULT (nextval('tablename_colname_seq'))
colname int NOT NULL DEFAULT nextval('tablename_colname_seq')
);
"""
end
Expand Down Expand Up @@ -399,7 +415,7 @@
ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5),
ALTER COLUMN tstamp DROP DEFAULT,
ALTER COLUMN tstamp TYPE timestamp with time zone
USING 'epoch'::timestamp with time zone + pg_catalog.date_part('epoch', tstamp) * '1 second'::interval,
USING 'epoch'::timestamp with time zone + (date_part('epoch', tstamp) * '1 second'::interval),
ALTER COLUMN tstamp SET DEFAULT now(),
ALTER COLUMN tstamp DROP DEFAULT,
ALTER COLUMN tstamp SET STATISTICS -5,
Expand Down

0 comments on commit 80a7c60

Please sign in to comment.