Обсуждение: Ensure that maxlen is an integer value in dict_int configuration

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

Ensure that maxlen is an integer value in dict_int configuration

От
Daniel Gustafsson
Дата:
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


Вложения

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

От
Arthur Zakirov
Дата:
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

От
Daniel Gustafsson
Дата:
> 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


Вложения