diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile
index 84199a9a5d0..d0e3852a878 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 bfd0ed2efb4..01f2ac671ec 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 00000000000..e0edec7cf7e
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/t/001_ecpg_err_warn_msg.pl
@@ -0,0 +1,37 @@
+
+# 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');
+
+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 erros 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 00000000000..e67dea1494f
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/t/002_ecpg_err_warn_msg_informix.pl
@@ -0,0 +1,19 @@
+
+# Copyright (c) 2021-2025, PostgreSQL Global Development Group
+
+use strict;
+use warnings FATAL => 'all';
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+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 with errors');
+
+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 00000000000..5ab0a761866
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/t/err_warn_msg.pgc
@@ -0,0 +1,42 @@
+/* Test ECPG warning/error messages */
+
+#include <stdlib.h>
+
+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 00000000000..839a023cb98
--- /dev/null
+++ b/src/interfaces/ecpg/preproc/t/err_warn_msg_informix.pgc
@@ -0,0 +1,18 @@
+/* Test ECPG warning/error messages */
+
+#include <stdlib.h>
+
+int
+main(void)
+{
+    /* For consistency with other tests */
+    $CONNECT TO testdb AS con1;
+
+    /* Test AT option usage at CLOSE statement in INFORMIX mode */
+    $AT con1 CLOSE database;
+
+    /* Test cursor name errors in INFORMIX mode */
+    $DECLARE database CURSOR FOR SELECT * FROM test;
+
+    return 0;
+}
