v2-0005-Add-trace-of-startup-packets-in-libpq_pipeline-te.patch
application/octet-stream
Filename: v2-0005-Add-trace-of-startup-packets-in-libpq_pipeline-te.patch
Type: application/octet-stream
Part: 2
Patch
Format: format-patch
Series: patch v2-0005
Subject: Add trace of startup packets in libpq_pipeline tests
| File | + | − |
|---|---|---|
| src/test/modules/libpq_pipeline/libpq_pipeline.c | 1 | 31 |
| src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl | 8 | 1 |
| src/test/modules/libpq_pipeline/traces/disallowed_in_pipeline.trace | 24 | 0 |
| src/test/modules/libpq_pipeline/traces/multi_pipelines.trace | 24 | 0 |
| src/test/modules/libpq_pipeline/traces/nosync.trace | 24 | 0 |
| src/test/modules/libpq_pipeline/traces/pipeline_abort.trace | 24 | 0 |
| src/test/modules/libpq_pipeline/traces/pipeline_idle.trace | 24 | 0 |
| src/test/modules/libpq_pipeline/traces/prepared.trace | 24 | 0 |
| src/test/modules/libpq_pipeline/traces/simple_pipeline.trace | 24 | 0 |
| src/test/modules/libpq_pipeline/traces/singlerow.trace | 24 | 0 |
| src/test/modules/libpq_pipeline/traces/transaction.trace | 24 | 0 |
From 2d90df5f4f008e5b80de79fd56b5fcd126ca2525 Mon Sep 17 00:00:00 2001
From: Anthonin Bonnefoy <anthonin.bonnefoy@datadoghq.com>
Date: Fri, 26 Jun 2026 14:32:00 +0200
Subject: Add trace of startup packets in libpq_pipeline tests
The current way to enable tracing in libpq_pipeline only set PQtrace
after the connection is created, missing the trace of the startup
packets.
This patch replaces it by the trace_file connection parameter, enabling
PQtrace before the first packet is sent and thus tracing all protocol
messages.
---
.../modules/libpq_pipeline/libpq_pipeline.c | 32 +------------------
.../libpq_pipeline/t/001_libpq_pipeline.pl | 9 +++++-
.../traces/disallowed_in_pipeline.trace | 24 ++++++++++++++
.../traces/multi_pipelines.trace | 24 ++++++++++++++
.../libpq_pipeline/traces/nosync.trace | 24 ++++++++++++++
.../traces/pipeline_abort.trace | 24 ++++++++++++++
.../libpq_pipeline/traces/pipeline_idle.trace | 24 ++++++++++++++
.../libpq_pipeline/traces/prepared.trace | 24 ++++++++++++++
.../traces/simple_pipeline.trace | 24 ++++++++++++++
.../libpq_pipeline/traces/singlerow.trace | 24 ++++++++++++++
.../libpq_pipeline/traces/transaction.trace | 24 ++++++++++++++
11 files changed, 225 insertions(+), 32 deletions(-)
diff --git a/src/test/modules/libpq_pipeline/libpq_pipeline.c b/src/test/modules/libpq_pipeline/libpq_pipeline.c
index 1660a68955e..e7526e46d46 100644
--- a/src/test/modules/libpq_pipeline/libpq_pipeline.c
+++ b/src/test/modules/libpq_pipeline/libpq_pipeline.c
@@ -31,10 +31,6 @@ static bool process_result(PGconn *conn, PGresult *res, int results,
static const char *const progname = "libpq_pipeline";
-/* Options and defaults */
-static char *tracefile = NULL; /* path to PQtrace() file */
-
-
#ifdef DEBUG_OUTPUT
#define pg_debug(...) do { fprintf(stderr, __VA_ARGS__); } while (0)
#else
@@ -2109,7 +2105,6 @@ usage(const char *progname)
fprintf(stderr, " %s [OPTION] tests\n", progname);
fprintf(stderr, " %s [OPTION] TESTNAME [CONNINFO]\n", progname);
fprintf(stderr, "\nOptions:\n");
- fprintf(stderr, " -t TRACEFILE generate a libpq trace to TRACEFILE\n");
fprintf(stderr, " -r NUMROWS use NUMROWS as the test size\n");
}
@@ -2136,13 +2131,12 @@ main(int argc, char **argv)
{
const char *conninfo = "";
PGconn *conn;
- FILE *trace = NULL;
char *testname;
int numrows = 10000;
PGresult *res;
int c;
- while ((c = getopt(argc, argv, "r:t:")) != -1)
+ while ((c = getopt(argc, argv, "r:")) != -1)
{
switch (c)
{
@@ -2156,9 +2150,6 @@ main(int argc, char **argv)
exit(1);
}
break;
- case 't': /* trace file */
- tracefile = pg_strdup(optarg);
- break;
}
}
@@ -2203,24 +2194,6 @@ main(int argc, char **argv)
pg_fatal("failed to set \"debug_parallel_query\": %s", PQerrorMessage(conn));
PQclear(res);
- /* Set the trace file, if requested */
- if (tracefile != NULL)
- {
- if (strcmp(tracefile, "-") == 0)
- trace = stdout;
- else
- trace = fopen(tracefile, "w");
- if (trace == NULL)
- pg_fatal("could not open file \"%s\": %m", tracefile);
-
- /* Make it line-buffered */
- setvbuf(trace, NULL, PG_IOLBF, 0);
-
- PQtrace(conn, trace);
- PQsetTraceFlags(conn,
- PQTRACE_SUPPRESS_TIMESTAMPS | PQTRACE_REGRESS_MODE);
- }
-
if (strcmp(testname, "cancel") == 0)
test_cancel(conn);
else if (strcmp(testname, "disallowed_in_pipeline") == 0)
@@ -2256,8 +2229,5 @@ main(int argc, char **argv)
/* close the connection to the database and cleanup */
PQfinish(conn);
- if (trace && trace != stdout)
- fclose(trace);
-
return 0;
}
diff --git a/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl b/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl
index c74fda8aa37..76816d6c343 100644
--- a/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl
+++ b/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl
@@ -44,9 +44,16 @@ for my $testname (@tests)
# For a bunch of tests, generate a libpq trace file too.
my $traceout =
"$PostgreSQL::Test::Utils::tmp_check/traces/$testname.trace";
+
+ local $ENV{PGTRACE};
+ local $ENV{PGTRACEFLAGS};
if ($cmptrace)
{
- push @extraargs, "-t" => $traceout;
+ $ENV{PGTRACE} = $traceout;
+ # Set trace flags to PQTRACE_SUPPRESS_TIMESTAMPS | PQTRACE_REGRESS_MODE
+ $ENV{PGTRACEFLAGS} = 3;
+ } else {
+ delete $ENV{PGTRACE};
}
# Execute the test using the latest protocol version.
diff --git a/src/test/modules/libpq_pipeline/traces/disallowed_in_pipeline.trace b/src/test/modules/libpq_pipeline/traces/disallowed_in_pipeline.trace
index dd6df03f1ed..1859e228cdb 100644
--- a/src/test/modules/libpq_pipeline/traces/disallowed_in_pipeline.trace
+++ b/src/test/modules/libpq_pipeline/traces/disallowed_in_pipeline.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 13 Query "SELECT 1"
B 33 RowDescription 1 "?column?" NNNN 0 NNNN 4 -1 0
B 11 DataRow 1 1 '1'
diff --git a/src/test/modules/libpq_pipeline/traces/multi_pipelines.trace b/src/test/modules/libpq_pipeline/traces/multi_pipelines.trace
index 1ee21f61dce..99b621bac21 100644
--- a/src/test/modules/libpq_pipeline/traces/multi_pipelines.trace
+++ b/src/test/modules/libpq_pipeline/traces/multi_pipelines.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 21 Parse "" "SELECT $1" 1 NNNN
F 19 Bind "" "" 0 1 1 '1' 1 0
F 6 Describe P ""
diff --git a/src/test/modules/libpq_pipeline/traces/nosync.trace b/src/test/modules/libpq_pipeline/traces/nosync.trace
index d99aac649db..f3ce2b1ed0b 100644
--- a/src/test/modules/libpq_pipeline/traces/nosync.trace
+++ b/src/test/modules/libpq_pipeline/traces/nosync.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 34 Parse "" "SELECT repeat('xyzxz', 12)" 0
F 14 Bind "" "" 0 0 1 0
F 6 Describe P ""
diff --git a/src/test/modules/libpq_pipeline/traces/pipeline_abort.trace b/src/test/modules/libpq_pipeline/traces/pipeline_abort.trace
index 3e5007d13b2..5e27a6dbe2f 100644
--- a/src/test/modules/libpq_pipeline/traces/pipeline_abort.trace
+++ b/src/test/modules/libpq_pipeline/traces/pipeline_abort.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 42 Query "DROP TABLE IF EXISTS pq_pipeline_demo"
B NN NoticeResponse S "NOTICE" V "NOTICE" C "00000" M "table "pq_pipeline_demo" does not exist, skipping" F "SSSS" L "SSSS" R "SSSS" \x00
B 15 CommandComplete "DROP TABLE"
diff --git a/src/test/modules/libpq_pipeline/traces/pipeline_idle.trace b/src/test/modules/libpq_pipeline/traces/pipeline_idle.trace
index 83ee415b03e..4c5215c0096 100644
--- a/src/test/modules/libpq_pipeline/traces/pipeline_idle.trace
+++ b/src/test/modules/libpq_pipeline/traces/pipeline_idle.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 16 Parse "" "SELECT 1" 0
F 14 Bind "" "" 0 0 1 0
F 6 Describe P ""
diff --git a/src/test/modules/libpq_pipeline/traces/prepared.trace b/src/test/modules/libpq_pipeline/traces/prepared.trace
index aeb5de109e0..3cd16969144 100644
--- a/src/test/modules/libpq_pipeline/traces/prepared.trace
+++ b/src/test/modules/libpq_pipeline/traces/prepared.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 68 Parse "select_one" "SELECT $1, '42', $1::numeric, interval '1 sec'" 1 NNNN
F 16 Describe S "select_one"
F 4 Sync
diff --git a/src/test/modules/libpq_pipeline/traces/simple_pipeline.trace b/src/test/modules/libpq_pipeline/traces/simple_pipeline.trace
index 5c94749bc1e..4f38387f6ca 100644
--- a/src/test/modules/libpq_pipeline/traces/simple_pipeline.trace
+++ b/src/test/modules/libpq_pipeline/traces/simple_pipeline.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 21 Parse "" "SELECT $1" 1 NNNN
F 19 Bind "" "" 0 1 1 '1' 1 0
F 6 Describe P ""
diff --git a/src/test/modules/libpq_pipeline/traces/singlerow.trace b/src/test/modules/libpq_pipeline/traces/singlerow.trace
index 029cd66581d..d918d2aa896 100644
--- a/src/test/modules/libpq_pipeline/traces/singlerow.trace
+++ b/src/test/modules/libpq_pipeline/traces/singlerow.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 38 Parse "" "SELECT generate_series(42, $1)" 0
F 20 Bind "" "" 0 1 2 '44' 1 0
F 6 Describe P ""
diff --git a/src/test/modules/libpq_pipeline/traces/transaction.trace b/src/test/modules/libpq_pipeline/traces/transaction.trace
index 1dcc2373c0b..9b79ae96237 100644
--- a/src/test/modules/libpq_pipeline/traces/transaction.trace
+++ b/src/test/modules/libpq_pipeline/traces/transaction.trace
@@ -1,3 +1,27 @@
+F NN StartupMessage 3 2 "user" "SSSS" "database" "SSSS" "application_name" "SSSS"
+B NN ParameterStatus "IntervalStyle" "SSSS"
+B NN ParameterStatus "search_path" "SSSS"
+B NN ParameterStatus "is_superuser" "SSSS"
+B NN ParameterStatus "standard_conforming_strings" "SSSS"
+B NN ParameterStatus "session_authorization" "SSSS"
+B NN ParameterStatus "client_encoding" "SSSS"
+B NN ParameterStatus "server_version" "SSSS"
+B NN ParameterStatus "server_encoding" "SSSS"
+B NN ParameterStatus "in_hot_standby" "SSSS"
+B NN ParameterStatus "integer_datetimes" "SSSS"
+B NN ParameterStatus "TimeZone" "SSSS"
+B NN ParameterStatus "application_name" "SSSS"
+B NN ParameterStatus "default_transaction_read_only" "SSSS"
+B NN ParameterStatus "scram_iterations" "SSSS"
+B NN ParameterStatus "DateStyle" "SSSS"
+B 40 BackendKeyData NNNN 'BBBB'
+B 5 ReadyForQuery I
+F 27 Query "SET lc_messages TO "C""
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
+F 35 Query "SET debug_parallel_query = off"
+B 8 CommandComplete "SET"
+B 5 ReadyForQuery I
F 79 Query "DROP TABLE IF EXISTS pq_pipeline_tst;CREATE TABLE pq_pipeline_tst (id int)"
B NN NoticeResponse S "NOTICE" V "NOTICE" C "00000" M "table "pq_pipeline_tst" does not exist, skipping" F "SSSS" L "SSSS" R "SSSS" \x00
B 15 CommandComplete "DROP TABLE"
--
2.54.0