postgres.git / summary / log / commit / refs

commit    9e8fd9f7ab56965dfe012d6be1df152ea8f62aec
Author:   Fujii Masao <fujii@postgresql.org>
Date:     Mon Jun 08 08:11:12 2026 +0000

    ecpg: Reject multiple header items in GET/SET DESCRIPTOR
    
    Previously, ecpg accepted multiple descriptor header items in GET DESCRIPTOR
    and SET DESCRIPTOR, but generated broken C code when they were used.
    Although the grammar allowed this syntax, the implementation did not actually
    support it.
    
    This commit tightens the ecpg grammar so the header form of GET/SET DESCRIPTOR
    accepts only a single header item, matching the implementation and preventing
    generation of broken C code.
    
    Also update the documentation synopsis accordingly.
    
    Backpatch to all supported versions.
    
    Author: Masashi Kamura <kamura.masashi@fujitsu.com>
    Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com>
    Reviewed-by: Lakshmi G <lakshmigcdac@gmail.com>
    Reviewed-by: Fujii Masao <masao.fujii@gmail.com>
    Discussion: https://postgr.es/m/OS9PR01MB13174AD7D1829D0644B6BB90E9447A@OS9PR01MB13174.jpnprd01.prod.outlook.com
    Backpatch-through: 14


doc/src/sgml/ecpg.sgml | 6 +++--- src/interfaces/ecpg/preproc/ecpg.trailer | 12 ++---------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml index 6f9d44cbd7f..d84025db6a6 100644 --- a/doc/src/sgml/ecpg.sgml +++ b/doc/src/sgml/ecpg.sgml @@ -7276,7 +7276,7 @@ EXEC SQL EXECUTE IMMEDIATE :command; <refsynopsisdiv> <synopsis> -GET DESCRIPTOR <replaceable class="parameter">descriptor_name</replaceable> <replaceable class="parameter">:cvariable</replaceable> = <replaceable class="parameter">descriptor_header_item</replaceable> [, ... ] +GET DESCRIPTOR <replaceable class="parameter">descriptor_name</replaceable> <replaceable class="parameter">:cvariable</replaceable> = <replaceable class="parameter">descriptor_header_item</replaceable> GET DESCRIPTOR <replaceable class="parameter">descriptor_name</replaceable> VALUE <replaceable class="parameter">column_number</replaceable> <replaceable class="parameter">:cvariable</replaceable> = <replaceable class="parameter">descriptor_item</replaceable> [, ... ] </synopsis> </refsynopsisdiv> @@ -7295,7 +7295,7 @@ GET DESCRIPTOR <replaceable class="parameter">descriptor_name</replaceable> VALU <para> This command has two forms: The first form retrieves - descriptor <quote>header</quote> items, which apply to the result + descriptor <quote>header</quote> item, which applies to the result set in its entirety. One example is the row count. The second form, which requires the column number as additional parameter, retrieves information about a particular column. Examples are @@ -7771,7 +7771,7 @@ EXEC SQL SET CONNECTION = con1; <refsynopsisdiv> <synopsis> -SET DESCRIPTOR <replaceable class="parameter">descriptor_name</replaceable> <replaceable class="parameter">descriptor_header_item</replaceable> = <replaceable>value</replaceable> [, ... ] +SET DESCRIPTOR <replaceable class="parameter">descriptor_name</replaceable> <replaceable class="parameter">descriptor_header_item</replaceable> = <replaceable>value</replaceable> SET DESCRIPTOR <replaceable class="parameter">descriptor_name</replaceable> VALUE <replaceable class="parameter">number</replaceable> <replaceable class="parameter">descriptor_item</replaceable> = <replaceable>value</replaceable> [, ...] </synopsis> </refsynopsisdiv> diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index b65e7876110..1b6504fbbd3 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -1178,27 +1178,19 @@ ECPGDeallocateDescr: DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar * manipulate a descriptor header */ -ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar ECPGGetDescHeaderItems +ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar ECPGGetDescHeaderItem { $$ = $3; } ; -ECPGGetDescHeaderItems: ECPGGetDescHeaderItem - | ECPGGetDescHeaderItems ',' ECPGGetDescHeaderItem - ; - ECPGGetDescHeaderItem: cvariable '=' desc_header_item { push_assignment($1, $3); } ; -ECPGSetDescriptorHeader: SET SQL_DESCRIPTOR quoted_ident_stringvar ECPGSetDescHeaderItems +ECPGSetDescriptorHeader: SET SQL_DESCRIPTOR quoted_ident_stringvar ECPGSetDescHeaderItem { $$ = $3; } ; -ECPGSetDescHeaderItems: ECPGSetDescHeaderItem - | ECPGSetDescHeaderItems ',' ECPGSetDescHeaderItem - ; - ECPGSetDescHeaderItem: desc_header_item '=' IntConstVar { push_assignment($3, $1); [parent: a4ca91ea1891]