spec/lib/normalize_spec.rb (57 lines of code) (raw):
require 'spec_helper'
describe PgQuery, '#normalize' do
it "normalizes a simple query" do
q = described_class.normalize("SELECT 1")
expect(q).to eq "SELECT $1"
end
it "normalizes IN(...)" do
q = described_class.normalize("SELECT 1 FROM x WHERE y = 12561 AND z = '124' AND b IN (1, 2, 3)")
expect(q).to eq "SELECT $1 FROM x WHERE y = $2 AND z = $3 AND b IN ($4, $5, $6)"
end
it "normalizes subselects" do
q = described_class.normalize("SELECT 1 FROM x WHERE y = (SELECT 123 FROM a WHERE z = 'bla')")
expect(q).to eq "SELECT $1 FROM x WHERE y = (SELECT $2 FROM a WHERE z = $3)"
end
it "normalizes ANY(array[...])" do
q = described_class.normalize("SELECT * FROM x WHERE y = ANY(array[1, 2])")
expect(q).to eq "SELECT * FROM x WHERE y = ANY(array[$1, $2])"
end
it "normalizes ANY(query)" do
q = described_class.normalize("SELECT * FROM x WHERE y = ANY(SELECT 1)")
expect(q).to eq "SELECT * FROM x WHERE y = ANY(SELECT $1)"
end
it "works with complicated strings" do
q = described_class.normalize("SELECT U&'d\\0061t\\+000061' FROM x")
expect(q).to eq "SELECT $1 FROM x"
q = described_class.normalize("SELECT u&'d\\0061t\\+000061' FROM x")
expect(q).to eq "SELECT $1 FROM x"
q = described_class.normalize("SELECT * FROM x WHERE z NOT LIKE E'abc'AND TRUE")
expect(q).to eq "SELECT * FROM x WHERE z NOT LIKE $1AND $2"
q = described_class.normalize("SELECT U&'d\\0061t\\+000061'-- comment\nFROM x")
expect(q).to eq "SELECT $1-- comment\nFROM x"
end
it "normalizes COPY" do
q = described_class.normalize("COPY (SELECT * FROM t WHERE id IN ('1', '2')) TO STDOUT")
expect(q).to eq "COPY (SELECT * FROM t WHERE id IN ($1, $2)) TO STDOUT"
end
it "normalizes SETs" do
q = described_class.normalize("SET test=123")
expect(q).to eq "SET test=$1"
end
it "normalizes weird SETs" do
q = described_class.normalize("SET CLIENT_ENCODING = UTF8")
expect(q).to eq "SET CLIENT_ENCODING = $1"
end
it "does not fail if it does not understand parts of the statement" do
q = described_class.normalize("DEALLOCATE bla; SELECT 1")
expect(q).to eq "DEALLOCATE bla; SELECT $1"
end
it 'normalizes EPXLAIN' do
q = described_class.normalize('EXPLAIN SELECT x FROM y WHERE z = 1')
expect(q).to eq 'EXPLAIN SELECT x FROM y WHERE z = $1'
end
it 'normalizes DECLARE CURSOR' do
q = described_class.normalize('DECLARE cursor_b CURSOR FOR SELECT * FROM databases WHERE id = 23')
expect(q).to eq 'DECLARE cursor_b CURSOR FOR SELECT * FROM databases WHERE id = $1'
end
end