Search Postgresql Archives

LIKE with pattern containing backslash

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Suppose I have this table:

    create table test(id int, x varchar)

And I want to find rows whose x contains at least one backslash. The backslash has to be escaped according to section 9.7.1 of the postgres docs.

    select *
    from test
    where x like E'%\\%'

I'll skip the results of my psql experimentation to avoid having to think about escaping backslashes from the command-line, inside psql.

My test data set has three rows:

   0    a\b
   1    a\\b
   2    a\\\b

I wrote a JDBC test program, with two variants.

1) Searching with literals, escaping the backslash, e.g.

    statement.executeQuery("select id, x from test where x like E'%\\%'")

This turns up all three rows. But this:

    statement.executeQuery("select id, x from test where x like E'%\\\\%'")

doesn't retrieve any rows. From the docs, I would expect the second query to retrieve rows with ids 1 and 2.

2) Avoiding literals completely, I created a PreparedStatement, and bound variables containing the patterns, e.g.

PreparedStatement find = connection.prepareStatement("select id, x from test where x like ?");
    String oneBackslash = new String(new byte[]{'%', '\\', '%'});
    find.setString(1, oneBackslash);
    ResultSet resultSet = find.executeQuery();

Now, searching for %\% turns up nothing, while searching for %\\% turns up all three rows.

BOTH behaviors seem wrong to me. In the first test (pattern specified as a literal), it looks like %\\% is not matching strings that do contain two backslashes. In the second test (pattern specified as a bound variable), it looks like the first slash in each pattern is interpreted as an escape. Which I didn't expect for a bound variable. Section 9.7.1 says "Note that the backslash already has a special meaning in string literals ..." This seems to apply to literals only, not to bound variables. And the need to have escapes in a bound variable escapes me (so to speak).

Can someone help in my understanding of what is correct behavior (in the literal and bound variable cases)? Is there a bug in the driver? in postgres? in the docs? Or in my understanding?

Jack Orenstein

P.S. If you want to play with this, I can send you my test programs for the cases described above.

--
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux