diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index 84199a9a5d0d..d0e3852a8788 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -81,6 +81,9 @@ ecpg_keywords.o: ecpg_kwlist_d.h c_keywords.o: c_kwlist_d.h keywords.o: $(top_srcdir)/src/include/parser/kwlist.h +check: + $(prove_check) + install: all installdirs $(INSTALL_PROGRAM) ecpg$(X) '$(DESTDIR)$(bindir)' diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build index bfd0ed2efb4d..01f2ac671ec6 100644 --- a/src/interfaces/ecpg/preproc/meson.build +++ b/src/interfaces/ecpg/preproc/meson.build @@ -86,3 +86,16 @@ ecpg_exe = executable('ecpg', ecpg_targets += ecpg_exe subdir('po', if_found: libintl) + +tests += { + 'name': 'ecpg', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_ecpg_err_warn_msg.pl', + 't/002_ecpg_err_warn_msg_informix.pl', + ], + 'deps': ecpg_exe, + }, +} \ No newline at end of file diff --git a/src/interfaces/ecpg/preproc/t/001_ecpg_err_warn_msg.pl b/src/interfaces/ecpg/preproc/t/001_ecpg_err_warn_msg.pl new file mode 100644 index 000000000000..a18e09e6ee85 --- /dev/null +++ b/src/interfaces/ecpg/preproc/t/001_ecpg_err_warn_msg.pl @@ -0,0 +1,40 @@ + +# Copyright (c) 2021-2025, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +program_help_ok('ecpg'); +program_version_ok('ecpg'); +program_options_handling_ok('ecpg'); +command_fails(['ecpg'], 'ecpg without arguments fails'); + +# Test that the ecpg command correctly detects unsupported or disallowed +# statements in the input file and reports the appropriate error or +# warning messages. +command_checks_all( + [ 'ecpg', 't/err_warn_msg.pgc' ], + 3, + [qr//], + [ + qr/ERROR: AT option not allowed in CONNECT statement/, + qr/ERROR: AT option not allowed in DISCONNECT statement/, + qr/ERROR: AT option not allowed in SET CONNECTION statement/, + qr/ERROR: AT option not allowed in TYPE statement/, + qr/ERROR: AT option not allowed in WHENEVER statement/, + qr/ERROR: AT option not allowed in VAR statement/, + qr/WARNING: COPY FROM STDIN is not implemented/, + qr/ERROR: using variable "cursor_var" in different declare statements is not supported/, + qr/ERROR: cursor "duplicate_cursor" is already defined/, + qr/ERROR: SHOW ALL is not implemented/, + qr/WARNING: no longer supported LIMIT/, + qr/WARNING: cursor "duplicate_cursor" has been declared but not opened/, + qr/WARNING: cursor "duplicate_cursor" has been declared but not opened/, + qr/WARNING: cursor ":cursor_var" has been declared but not opened/, + qr/WARNING: cursor ":cursor_var" has been declared but not opened/ + ], + 'ecpg with errors and warnings'); + +done_testing(); diff --git a/src/interfaces/ecpg/preproc/t/002_ecpg_err_warn_msg_informix.pl b/src/interfaces/ecpg/preproc/t/002_ecpg_err_warn_msg_informix.pl new file mode 100644 index 000000000000..cb0502dfc2b0 --- /dev/null +++ b/src/interfaces/ecpg/preproc/t/002_ecpg_err_warn_msg_informix.pl @@ -0,0 +1,22 @@ + +# Copyright (c) 2021-2025, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +# Test that the ecpg command in INFORMIX mode correctly detects +# unsupported or disallowed statements in the input file and reports +# the appropriate error or warning messages. +command_checks_all( + [ 'ecpg', '-C', 'INFORMIX', 't/err_warn_msg_informix.pgc' ], + 3, + [qr//], + [ + qr/ERROR: AT option not allowed in CLOSE DATABASE statement/, + qr/ERROR: "database" cannot be used as cursor name in INFORMIX mode/ + ], + 'ecpg in INFORMIX mode with errors and warnings'); + +done_testing(); diff --git a/src/interfaces/ecpg/preproc/t/err_warn_msg.pgc b/src/interfaces/ecpg/preproc/t/err_warn_msg.pgc new file mode 100644 index 000000000000..5ab0a7618663 --- /dev/null +++ b/src/interfaces/ecpg/preproc/t/err_warn_msg.pgc @@ -0,0 +1,42 @@ +/* Test ECPG warning/error messages */ + +#include + +int +main(void) +{ + EXEC SQL BEGIN DECLARE SECTION; + char *cursor_var = "mycursor"; + short a; + EXEC SQL END DECLARE SECTION; + + /* For consistency with other tests */ + EXEC SQL CONNECT TO testdb AS con1; + + /* Test AT option errors */ + EXEC SQL AT con1 CONNECT TO testdb2; + EXEC SQL AT con1 DISCONNECT; + EXEC SQL AT con1 SET CONNECTION TO testdb2; + EXEC SQL AT con1 TYPE string IS char[11]; + EXEC SQL AT con1 WHENEVER NOT FOUND CONTINUE; + EXEC SQL AT con1 VAR a IS int; + + /* Test COPY FROM STDIN warning */ + EXEC SQL COPY test FROM stdin; + + /* Test same variable in multi declare statement */ + EXEC SQL DECLARE :cursor_var CURSOR FOR SELECT * FROM test; + EXEC SQL DECLARE :cursor_var CURSOR FOR SELECT * FROM test; + + /* Test duplicate cursor declarations */ + EXEC SQL DECLARE duplicate_cursor CURSOR FOR SELECT * FROM test; + EXEC SQL DECLARE duplicate_cursor CURSOR FOR SELECT * FROM test; + + /* Test SHOW ALL error */ + EXEC SQL SHOW ALL; + + /* Test deprecated LIMIT syntax warning */ + EXEC SQL SELECT * FROM test LIMIT 10, 5; + + return 0; +} diff --git a/src/interfaces/ecpg/preproc/t/err_warn_msg_informix.pgc b/src/interfaces/ecpg/preproc/t/err_warn_msg_informix.pgc new file mode 100644 index 000000000000..e8db65eefa1d --- /dev/null +++ b/src/interfaces/ecpg/preproc/t/err_warn_msg_informix.pgc @@ -0,0 +1,18 @@ +/* Test ECPG warning/error messages in INFORMIX mode */ + +#include + +int +main(void) +{ + /* For consistency with other tests */ + $CONNECT TO testdb AS con1; + + /* Test AT option usage at CLOSE DATABASE statement in INFORMIX mode */ + $AT con1 CLOSE DATABASE; + + /* Test cursor name errors in INFORMIX mode */ + $DECLARE database CURSOR FOR SELECT * FROM test; + + return 0; +}