[GRASS-user] Problem with executing some type od queries (with regular expresion parser)

Glynn Clements glynn at gclements.plus.com
Thu Oct 30 17:16:56 EDT 2008


Jarek Jasiewicz wrote:

> D3/3: db_select_int()
> D3/3:   SQL: SELECT cat FROM streams_coor WHERE link::text IN(SELECT 
> regexp_split_to_table((SELECT branch FROM links WHERE keyid='168'), E'\\.'))
> D3/3: Escaped SQL: SELECT cat FROM streams_coor WHERE link::text 
> IN(SELECT regexp_split_to_table((SELECT branch FROM links WHERE 
> keyid='168'), E'\\\\.'))
> D3/3: describe_table()
> 
> As we see, there is a problem with escape \ backslash
> grass (I don't know gis.m or  db_select_int()) adds backslash before.
> In pgAdmin I must add escape character manually as in example in post 
> before.
> 
> In gis.m this command should look like:
> 
> link::text IN(
>     SELECT regexp_split_to_table((
>         SELECT branch FROM links WHERE keyid='168'), E'\.'))
> 
> And everythik is OK. Porblem solved.

db/drivers/postgres/execute.c has the following:

    /* Postgres supports in addition to standard escape character ' (apostrophe) also \ (basckslash)
     * as this is not SQL standard, GRASS modules cannot work escape all \ in the text
     * because other drivers do not support this feature. For example, if a text contains 
     * string \' GRASS modules escape ' by another ' and string passed to driver is \''
     * postgres takes \' as ' but second ' remains not escaped, result is error.
     * Because of this, all occurencies of \ in sql are escaped by \ */
    str = G_str_replace(db_get_string(sql), "\\", "\\\\");

[Note that "\\" is a string containing a single backslash, as C also
uses backslash as an escape character.]

IOW, the "pg" DBMI driver assumes that every backslash which it sees
is supposed to be a literal backslash, and converts it to a
double-backslash escape sequence to ensure that it is interpreted as
such.

So you can't use PostgreSQL's C-like escapes (\n etc) within SQL
syntax.

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the grass-user mailing list