Thread: Ensure that maxlen is an integer value in dict_int configuration

Ensure that maxlen is an integer value in dict_int configuration

From
Daniel Gustafsson
Date:
I recently had a usecase for dict_int, typoed my script and spent longer than
I’d like to admit finding said typo.  The attached patch scratches my itch by
ensuring that the maxlen parameter to dict_int is integer, instead of silently
setting it to zero on malformed input. Instead of this:

dg=# alter text search dictionary intdict (maxlen = a, rejectlong = true);
ALTER TEXT SEARCH DICTIONARY
dg=# select ts_lexize('intdict', '12345678');
 ts_lexize
-----------
 {}
(1 row)

.. the attached will error out with “ERROR: maxlen is out of range, must
be integer”, and be more in line with how we handle DefElem values.  A quick
grep around the tree didn’t turn up any other defelems doing this so I think
this is the only callsite.

cheers ./daniel


Attachment

Re: Ensure that maxlen is an integer value in dict_int configuration

From
Arthur Zakirov
Date:
On Tue, Mar 27, 2018 at 01:17:20PM +0200, Daniel Gustafsson wrote:
> I recently had a usecase for dict_int, typoed my script and spent longer than
> I’d like to admit finding said typo.  The attached patch scratches my itch by
> ensuring that the maxlen parameter to dict_int is integer, instead of silently
> setting it to zero on malformed input. Instead of this:
> 
> dg=# alter text search dictionary intdict (maxlen = a, rejectlong = true);
> ALTER TEXT SEARCH DICTIONARY
> dg=# select ts_lexize('intdict', '12345678');
>  ts_lexize
> -----------
>  {}
> (1 row)

But the patch breaks options parsing in another place. After the patch:

=# alter text search dictionary intdict (maxlen = 3, rejectlong = true);
ALTER TEXT SEARCH DICTIONARY
=# select ts_lexize('intdict', '12345678');
ERROR:  maxlen requires an integer value

It is because all options are stored as string:

=# select dictinitoption from pg_ts_dict where dictname = 'intdict';
          dictinitoption           
-----------------------------------
 maxlen = '5', rejectlong = 'true'

So the right fix could be as it done in postgres_fdw_validator() for
'fetch_size' option.

-- 
Arthur Zakirov
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company


Re: Ensure that maxlen is an integer value in dict_int configuration

From
Daniel Gustafsson
Date:
> On 27 Mar 2018, at 15:04, Arthur Zakirov <a.zakirov@postgrespro.ru> wrote:

> But the patch breaks options parsing in another place. After the patch:

> So the right fix could be as it done in postgres_fdw_validator() for
> 'fetch_size' option.

Doh.  I had a strtol() first but found the defGetInt32() version elegantly
small..  but I kept testing the former patch the whole time.  Attached is my
first version which now turned into the second.  Thanks for looking at the
patch, I’ll go stand in the corner a bit now.

cheers ./daniel


Attachment