Обсуждение: substring syntax with regexp

Поиск
Список
Период
Сортировка

substring syntax with regexp

От
joseph speigle
Дата:
hi,

Does anybody know offhand what is the correct way to use substr to extract the domain name from a client_referer column
aslogged by mod_pgsqllog (httpd module), by correcting the following: 


the file 'hostname.sql' is pl/pgsql


main=> \e hostname.sql
ERROR:  syntax error at or near "http" at character 290
LINE 13:   newuri = substr(tempuri from 'http://[^/]*/.*');
                                         ^
I don't know, the docs are:

The substring function with two parameters, substring(string from pattern), provides extraction of a substring that
matchesa POSIX regular expression pattern.  

(http://www.postgresql.org/docs/current/static/functions-matching.html)


the full 'hostname.sql' as is now is:

CREATE or replace FUNCTION hostname() RETURNS setof logpgsql.stats_type as
'
declare
        row stats_type%ROWTYPE;
        rec record;
        newurl varchar(100);
        tempurl varchar(100);
begin
     for rec in SELECT * from stats
                 loop
                row.c = rec.c;
                tempurl = rec.url;
                newuri = substr(tempuri from 'http://[^/]*/.*');
                row.uri = newurl;
                row.r = rec.r;
                return next row;
        end loop;
        return next row;
        return;
end
'
LANGUAGE 'plpgsql';


Re: substring syntax with regexp

От
Ian Barwick
Дата:
On Wed, 30 Jun 2004 08:45:18 -0500, joseph speigle <joe.speigle@jklh.us> wrote:
> hi,
>
> Does anybody know offhand what is the correct way to use substr to extract the domain name from a client_referer
columnas logged by mod_pgsqllog (httpd module), by correcting the following: 
>
> the file 'hostname.sql' is pl/pgsql
>
> main=> \e hostname.sql
> ERROR:  syntax error at or near "http" at character 290
> LINE 13:   newuri = substr(tempuri from 'http://[^/]*/.*');

You have several immediate problems with this line:
- your regex should be double-quoted;
- the relevant function is "substring", not "substr";
- the regex pattern you want is probably more like :
   'http://([^/]*)/', e.g.

test=> select substring('http://www.example.com/dir/file.html' from
'http://([^/]*)');
  substring
-------------
 www.example.com
(1 row)

HTH

Ian Barwick

Re: substring syntax with regexp

От
Alvaro Herrera
Дата:
On Wed, Jun 30, 2004 at 08:45:18AM -0500, joseph speigle wrote:
> hi,
>
> Does anybody know offhand what is the correct way to use substr to
> extract the domain name from a client_referer column as logged by
> mod_pgsqllog (httpd module), by correcting the following:

Nah, your problem is before the syntax of the substr function.  You have
to quote your single quotes in the function text.  So the relevant like
would look like

>                 newuri = substr(tempuri from ''http://[^/]*/.*'');

I didn't look at the rest of the function ...

--
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Uno combate cuando es necesario... ¡no cuando está de humor!
El humor es para el ganado, o para hacer el amor, o para tocar el
baliset.  No para combatir."  (Gurney Halleck)


Re: substring syntax with regexp

От
Stephan Szabo
Дата:
On Wed, 30 Jun 2004, joseph speigle wrote:

> main=> \e hostname.sql
> ERROR:  syntax error at or near "http" at character 290
> LINE 13:   newuri = substr(tempuri from 'http://[^/]*/.*');

You probably need to double those quotes ('') since it's inside
a quoted string (the function body).


Re: substring syntax with regexp

От
Richard Huxton
Дата:
joseph speigle wrote:
> hi,
>
> Does anybody know offhand what is the correct way to use substr to
> extract the domain name from a client_referer column as logged by
> mod_pgsqllog (httpd module), by correcting the following:

You have a quoting problem

> CREATE or replace FUNCTION hostname() RETURNS setof
> logpgsql.stats_type as ' declare row stats_type%ROWTYPE; rec record;
> newurl varchar(100); tempurl varchar(100); begin for rec in SELECT *
> from stats loop row.c = rec.c; tempurl = rec.url; newuri =
> substr(tempuri from 'http://[^/]*/.*');

OK, you probably want to use := for assignment. Also, you're already
inside one set of quotes, so you'll need to escape the quotes for your
string.

     newuri := substr(tempuri from ''http://[^/]*/.*'');
or
     newuri := substr(tempuri from \'http://[^/]*/.*\');

--
   Richard Huxton
   Archonet Ltd

Re: substring syntax with regexp

От
Tom Lane
Дата:
joseph speigle <joe.speigle@jklh.us> writes:
> CREATE or replace FUNCTION hostname() RETURNS setof logpgsql.stats_type as
> '
> declare
> ...
>                 newuri = substr(tempuri from 'http://[^/]*/.*');

You forgot about doubling quotes within a function body :-(

            regards, tom lane

Re: substring syntax with regexp

От
joseph speigle
Дата:
hi,
thanks everybody.  It was a combination of:

changing function name from substr to substring
double-quoting inside the function
using select into inside the plpgsql function to retrieve the substring


-- retrieve hostname from the client_referrer field
CREATE OR REPLACE FUNCTION hostname() RETURNS setof modlog.stats_type AS
'
DECLARE
  row stats_type%ROWTYPE;
  rec record;
  newclient_referrer varchar(100);
BEGIN
   FOR rec IN SELECT * FROM stats ORDER BY uri_hits DESC
   LOOP
    row.uri_hits = rec.uri_hits;
    SELECT INTO row.client_referrer SUBSTRING(rec.client_referrer FROM ''http://([^/]*).*'');
    IF row.client_referrer IS NULL THEN
      -- /cgi-bin/404.pl etc.
       row.client_referrer := ''localhost'';
    END IF;
    row.uri = NULL;
    RETURN NEXT row;
  END LOOP;
  RETURN NEXT ROW;
  RETURN;
END
'
LANGUAGE 'plpgsql';
select * from hostname();