Hi, On 8/16/23 2:08 PM, Michael Paquier wrote:
On Wed, Aug 16, 2023 at 01:43:35PM +0200, Drouvot, Bertrand wrote:Yeah, agree, done that way in v6 (also added a test in 001_worker_spi.pl to ensure that "worker_spi_main" is reported in pg_wait_event).-typedef struct WaitEventExtensionEntryByName -{ - char wait_event_name[NAMEDATALEN]; /* hash key */ - uint16 event_id; /* wait event ID */ -} WaitEventExtensionEntryByName; I'd rather keep all these structures local to wait_event.c, as these cover the internals of the hash tables. Could you switch GetWaitEventExtensionEntries() so as it returns a list of strings or an array of char*? We probably can live with the list for that.
Yeah, I was not sure about this (returning a list of WaitEventExtensionEntryByName or a list of wait event names) while working on v6. That's true that the only need here is to get the names of the custom wait events. Returning only the names would allow us to move the WaitEventExtensionEntryByName definition back to the wait_event.c file. It makes sense to me, done in v7 attached and renamed the function to GetWaitEventExtensionNames().
+ char buf[NAMEDATALEN + 44]; //"Custom wait event \"%Name%\" defined by extension" + Incorrect comment. This would be simpler as a StringInfo.
Yeah and probably less error prone: done in v7. While at it, v7 is deliberately not calling "pfree(waiteventnames)" and "resetStringInfo(&buf)" in pg_get_wait_events(): reason is that they are palloc in a short-lived memory context while executing pg_get_wait_events(). Regards, -- Bertrand Drouvot PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com
From 43baf166f14aeca4ef0979d93e9ed34fdc323a09 Mon Sep 17 00:00:00 2001 From: bdrouvotAWS <[email protected]> Date: Sat, 5 Aug 2023 12:39:42 +0000 Subject: [PATCH v7] Add catalog pg_wait_event Adding a new system view, namely pg_wait_event, that describes the wait events. --- doc/src/sgml/system-views.sgml | 64 +++++++++++++ src/backend/Makefile | 3 +- src/backend/catalog/system_views.sql | 3 + src/backend/utils/activity/.gitignore | 1 + src/backend/utils/activity/Makefile | 8 +- .../activity/generate-wait_event_types.pl | 54 ++++++++++- src/backend/utils/activity/meson.build | 1 + src/backend/utils/activity/wait_event.c | 44 +++++++++ src/backend/utils/activity/wait_event_funcs.c | 93 +++++++++++++++++++ src/include/catalog/pg_proc.dat | 6 ++ src/include/utils/meson.build | 4 +- src/include/utils/wait_event.h | 1 + .../modules/worker_spi/t/001_worker_spi.pl | 6 ++ src/test/regress/expected/rules.out | 4 + src/test/regress/expected/sysviews.out | 16 ++++ src/test/regress/sql/sysviews.sql | 4 + src/tools/msvc/Solution.pm | 3 +- src/tools/msvc/clean.bat | 1 + 18 files changed, 306 insertions(+), 10 deletions(-) 16.3% doc/src/sgml/ 63.1% src/backend/utils/activity/ 3.7% src/include/catalog/ 3.0% src/test/modules/worker_spi/t/ 4.8% src/test/regress/expected/ 3.2% src/tools/msvc/ 5.5% src/ diff --git a/doc/src/sgml/system-views.sgml b/doc/src/sgml/system-views.sgml index 57b228076e..b2ed309fe2 100644 --- a/doc/src/sgml/system-views.sgml +++ b/doc/src/sgml/system-views.sgml @@ -221,6 +221,11 @@ <entry>views</entry> </row> + <row> + <entry><link linkend="view-pg-wait-event"><structname>pg_wait_event</structname></link></entry> + <entry>wait events</entry> + </row> + </tbody> </tgroup> </table> @@ -4825,4 +4830,63 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx </table> </sect1> + + <sect1 id="view-pg-wait-event"> + <title><structname>pg_wait_event</structname></title> + + <indexterm zone="view-pg-wait-event"> + <primary>pg_wait_event</primary> + </indexterm> + + <para> + The view <structname>pg_wait_event</structname> provides description about the + wait events. + </para> + + <table> + <title><structname>pg_wait_event</structname> Columns</title> + <tgroup cols="1"> + <thead> + <row> + <entry role="catalog_table_entry"><para role="column_definition"> + Column Type + </para> + <para> + Description + </para></entry> + </row> + </thead> + + <tbody> + <row> + <entry role="catalog_table_entry"><para role="column_definition"> + <structfield>type</structfield> <type>text</type> + </para> + <para> + Wait event type + </para></entry> + </row> + + <row> + <entry role="catalog_table_entry"><para role="column_definition"> + <structfield>name</structfield> <type>text</type> + </para> + <para> + Wait event name + </para></entry> + </row> + + <row> + <entry role="catalog_table_entry"><para role="column_definition"> + <structfield>description</structfield> <type>text</type> + </para> + <para> + Wait event description + </para></entry> + </row> + </tbody> + </tgroup> + </table> + </sect1> + </chapter> diff --git a/src/backend/Makefile b/src/backend/Makefile index 1c929383c4..3e275ac759 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -134,7 +134,7 @@ storage/lmgr/lwlocknames.h: storage/lmgr/generate-lwlocknames.pl storage/lmgr/lw $(MAKE) -C storage/lmgr lwlocknames.h lwlocknames.c utils/activity/wait_event_types.h: utils/activity/generate-wait_event_types.pl utils/activity/wait_event_names.txt - $(MAKE) -C utils/activity wait_event_types.h pgstat_wait_event.c + $(MAKE) -C utils/activity wait_event_types.h pgstat_wait_event.c wait_event_funcs_data.c # run this unconditionally to avoid needing to know its dependencies here: submake-catalog-headers: @@ -311,6 +311,7 @@ maintainer-clean: distclean storage/lmgr/lwlocknames.c \ storage/lmgr/lwlocknames.h \ utils/activity/pgstat_wait_event.c \ + utils/activity/wait_event_funcs_data.c \ utils/activity/wait_event_types.h \ utils/adt/jsonpath_gram.c \ utils/adt/jsonpath_gram.h \ diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index af65af6bdd..f86a4dd770 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1342,3 +1342,6 @@ CREATE VIEW pg_stat_subscription_stats AS ss.stats_reset FROM pg_subscription as s, pg_stat_get_subscription_stats(s.oid) as ss; + +CREATE VIEW pg_wait_event AS + SELECT * FROM pg_get_wait_events() AS we; diff --git a/src/backend/utils/activity/.gitignore b/src/backend/utils/activity/.gitignore index d77079285b..bd0c0c7772 100644 --- a/src/backend/utils/activity/.gitignore +++ b/src/backend/utils/activity/.gitignore @@ -1,2 +1,3 @@ /pgstat_wait_event.c /wait_event_types.h +/wait_event_funcs_data.c diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile index f1117745d4..f57cf3958c 100644 --- a/src/backend/utils/activity/Makefile +++ b/src/backend/utils/activity/Makefile @@ -32,10 +32,14 @@ OBJS = \ pgstat_subscription.o \ pgstat_wal.o \ pgstat_xact.o \ - wait_event.o + wait_event.o \ + wait_event_funcs.o include $(top_srcdir)/src/backend/common.mk +wait_event_funcs.o: wait_event_funcs_data.c +wait_event_funcs_data.c: wait_event_types.h + wait_event.o: pgstat_wait_event.c pgstat_wait_event.c: wait_event_types.h touch $@ @@ -44,4 +48,4 @@ wait_event_types.h: $(top_srcdir)/src/backend/utils/activity/wait_event_names.tx $(PERL) $(srcdir)/generate-wait_event_types.pl --code $< maintainer-clean: clean - rm -f wait_event_types.h pgstat_wait_event.c + rm -f wait_event_types.h pgstat_wait_event.c wait_event_funcs_data.c diff --git a/src/backend/utils/activity/generate-wait_event_types.pl b/src/backend/utils/activity/generate-wait_event_types.pl index 56335e8730..9d5bfd2145 100644 --- a/src/backend/utils/activity/generate-wait_event_types.pl +++ b/src/backend/utils/activity/generate-wait_event_types.pl @@ -4,6 +4,7 @@ # Generate wait events support files from wait_event_names.txt: # - wait_event_types.h (if --code is passed) # - pgstat_wait_event.c (if --code is passed) +# - wait_event_funcs_data.c (if --code is passed) # - wait_event_types.sgml (if --docs is passed) # # Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group @@ -98,8 +99,10 @@ if ($gen_code) # multiple times. my $htmp = "$output_path/wait_event_types.h.tmp$$"; my $ctmp = "$output_path/pgstat_wait_event.c.tmp$$"; + my $wctmp = "$output_path/wait_event_funcs_data.c.tmp$$"; open my $h, '>', $htmp or die "Could not open $htmp: $!"; open my $c, '>', $ctmp or die "Could not open $ctmp: $!"; + open my $wc, '>', $wctmp or die "Could not open $wctmp: $!"; my $header_comment = '/*------------------------------------------------------------------------- @@ -129,12 +132,14 @@ if ($gen_code) printf $c $header_comment, 'pgstat_wait_event.c'; + printf $wc $header_comment, 'wait_event_funcs_data.c'; + + # Generate the pgstat_wait_event.c and wait_event_types.h files # uc() is being used to force the comparison to be case-insensitive. foreach my $waitclass (sort { uc($a) cmp uc($b) } keys %hashwe) { - - # Don't generate .c and .h files for Extension, LWLock and - # Lock, these are handled independently. + # Don't generate the pgstat_wait_event.c and wait_event_types.h files + # for Extension, LWLock and Lock, these are handled independently. next if ( $waitclass eq 'WaitEventExtension' || $waitclass eq 'WaitEventLWLock' @@ -183,14 +188,55 @@ if ($gen_code) printf $c "}\n\n"; } + # Generate wait_event_funcs_data.c, for the contents of static C + # structure holding all the information about the wait events. + # uc() is being used to force the comparison to be case-insensitive, + # even though it is not strictly mandatory here. + foreach my $waitclass (sort { uc($a) cmp uc($b) } keys %hashwe) + { + my $last = $waitclass; + $last =~ s/^WaitEvent//; + + foreach my $wev (@{ $hashwe{$waitclass} }) + { + my $new_desc = substr $wev->[2], 1, -2; + # Escape single quotes. + $new_desc =~ s/'/\\'/g; + + # Replace the "quote" markups by real ones. + $new_desc =~ s/<quote>(.*?)<\/quote>/\\"$1\\"/g; + + # Remove SGML markups. + $new_desc =~ s/<.*?>(.*?)<.*?>/$1/g; + + # Tweak contents about links <xref linkend="text"/> on GUCs, + while (my ($capture) = + $new_desc =~ m/<xref linkend="guc-(.*?)"\/>/g) + { + $capture =~ s/-/_/g; + $new_desc =~ s/<xref linkend="guc-.*?"\/>/$capture/g; + } + # Then remove any reference to "see <xref linkend="text"/>". + $new_desc =~ s/; see.*$//; + + # One element to the C structure holding the wait event + # info, as of (type, name, description). + printf $wc "\t{\"%s\", \"%s\", \"%s\"},\n", $last, $wev->[1], + $new_desc; + } + } + printf $h "#endif /* WAIT_EVENT_TYPES_H */\n"; close $h; close $c; + close $wc; rename($htmp, "$output_path/wait_event_types.h") || die "rename: $htmp to $output_path/wait_event_types.h: $!"; rename($ctmp, "$output_path/pgstat_wait_event.c") || die "rename: $ctmp to $output_path/pgstat_wait_event.c: $!"; + rename($wctmp, "$output_path/wait_event_funcs_data.c") + || die "rename: $ctmp to $output_path/wait_event_funcs_data.c: $!"; } # Generate the .sgml file. elsif ($gen_docs) @@ -249,7 +295,7 @@ Usage: perl [--output <path>] [--code ] [ --sgml ] input_file Options: --outdir Output directory (default '.') - --code Generate wait_event_types.h and pgstat_wait_event.c. + --code Generate C and header files. --sgml Generate wait_event_types.sgml. generate-wait_event_types.pl generates the SGML documentation and code diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build index 9633f3623c..46a27e7548 100644 --- a/src/backend/utils/activity/meson.build +++ b/src/backend/utils/activity/meson.build @@ -23,6 +23,7 @@ backend_sources += files( # seems nicer to not add that as an include path for the whole backend. waitevent_sources = files( 'wait_event.c', + 'wait_event_funcs.c', ) wait_event = static_library('wait_event_names', diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c index 4b9b5c01cb..d31767df80 100644 --- a/src/backend/utils/activity/wait_event.c +++ b/src/backend/utils/activity/wait_event.c @@ -264,6 +264,50 @@ GetWaitEventExtensionIdentifier(uint16 eventId) } +/* + * Returns a list of currently defined custom wait event names for extensions. + * The result is a palloc'd array, with the number of elements returned into + * *nwaitevents. + */ +char ** +GetWaitEventExtensionNames(int *nwaitevents) +{ + char **waiteventnames; + WaitEventExtensionEntryByName *hentry; + HASH_SEQ_STATUS hash_seq; + int index; + int els; + + LWLockAcquire(WaitEventExtensionLock, LW_SHARED); + + /* Now we can safely count the number of entries */ + els = hash_get_num_entries(WaitEventExtensionHashByName); + + /* Allocate enough space for all entries */ + waiteventnames = palloc(els * sizeof(char[NAMEDATALEN])); + + /* Now scan the hash table to copy the data */ + hash_seq_init(&hash_seq, WaitEventExtensionHashByName); + + index = 0; + while ((hentry = (WaitEventExtensionEntryByName *) hash_seq_search(&hash_seq)) != NULL) + { + + waiteventnames[index] = palloc(sizeof(char[NAMEDATALEN])); + strlcpy(waiteventnames[index], hentry->wait_event_name, + sizeof(char[NAMEDATALEN])); + + index++; + } + + LWLockRelease(WaitEventExtensionLock); + + Assert(index == els); + + *nwaitevents = index; + return waiteventnames; +} + /* * Configure wait event reporting to report wait events to *wait_event_info. * *wait_event_info needs to be valid until pgstat_reset_wait_event_storage() diff --git a/src/backend/utils/activity/wait_event_funcs.c b/src/backend/utils/activity/wait_event_funcs.c new file mode 100644 index 0000000000..74506f989e --- /dev/null +++ b/src/backend/utils/activity/wait_event_funcs.c @@ -0,0 +1,93 @@ +/*------------------------------------------------------------------------ + * + * wait_event_funcs.c + * Functions for accessing wait event data. + * + * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/utils/activity/wait_event_funcs.c + * + *------------------------------------------------------------------------ + */ +#include "postgres.h" + +#include "funcapi.h" +#include "utils/builtins.h" +#include "utils/wait_event.h" + +/* + * Each wait event has one corresponding entry in this structure, fed to + * the SQL function of this file. + */ +static const struct +{ + const char *type; + const char *name; + const char *description; +} + +waitEventData[] = +{ +#include "wait_event_funcs_data.c" + /* end of list */ + {NULL, NULL, NULL} +}; + + +/* + * pg_get_wait_events + * + * List all the wait events (type, name) and their descriptions. + */ +Datum +pg_get_wait_events(PG_FUNCTION_ARGS) +{ +#define PG_GET_WAIT_EVENTS_COLS 3 + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + char **waiteventnames; + int nbextwaitevents; + + /* Build tuplestore to hold the result rows */ + InitMaterializedSRF(fcinfo, 0); + + /* Iterate over the list of wait events */ + for (int idx = 0; waitEventData[idx].type != NULL; idx++) + { + Datum values[PG_GET_WAIT_EVENTS_COLS] = {0}; + bool nulls[PG_GET_WAIT_EVENTS_COLS] = {0}; + + values[0] = CStringGetTextDatum(waitEventData[idx].type); + values[1] = CStringGetTextDatum(waitEventData[idx].name); + values[2] = CStringGetTextDatum(waitEventData[idx].description); + + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); + } + + /* Handling extension custom wait events */ + waiteventnames = GetWaitEventExtensionNames(&nbextwaitevents); + + for (int idx = 0; idx < nbextwaitevents; idx++) + { + StringInfoData buf; + Datum values[PG_GET_WAIT_EVENTS_COLS] = {0}; + bool nulls[PG_GET_WAIT_EVENTS_COLS] = {0}; + + + values[0] = CStringGetTextDatum("Extension"); + values[1] = CStringGetTextDatum(waiteventnames[idx]); + + initStringInfo(&buf); + appendStringInfoString(&buf, "Custom wait event \""); + appendStringInfoString(&buf, waiteventnames[idx]); + appendStringInfoString(&buf, "\" defined by extension"); + + values[2] = CStringGetTextDatum(buf.data); + + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); + } + + return (Datum) 0; +} diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 6996073989..1a942c678c 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5417,6 +5417,12 @@ proargmodes => '{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}', proargnames => '{pid,datid,pid,usesysid,application_name,state,query,wait_event_type,wait_event,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port,backend_xid,backend_xmin,backend_type,ssl,sslversion,sslcipher,sslbits,ssl_client_dn,ssl_client_serial,ssl_issuer_dn,gss_auth,gss_princ,gss_enc,gss_delegation,leader_pid,query_id}', prosrc => 'pg_stat_get_activity' }, +{ oid => '8403', descr => 'describe wait events', + proname => 'pg_get_wait_events', procost => '10', prorows => '100', + proretset => 't', provolatile => 's', prorettype => 'record', + proargtypes => '', proallargtypes => '{text,text,text}', + proargmodes => '{o,o,o}', proargnames => '{type,name,description}', + prosrc => 'pg_get_wait_events' }, { oid => '3318', descr => 'statistics: information about progress of backends running maintenance command', proname => 'pg_stat_get_progress_info', prorows => '100', proretset => 't', diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build index 6de5d93799..c179478611 100644 --- a/src/include/utils/meson.build +++ b/src/include/utils/meson.build @@ -1,6 +1,6 @@ # Copyright (c) 2022-2023, PostgreSQL Global Development Group -wait_event_output = ['wait_event_types.h', 'pgstat_wait_event.c'] +wait_event_output = ['wait_event_types.h', 'pgstat_wait_event.c', 'wait_event_funcs_data.c'] wait_event_target = custom_target('wait_event_names', input: files('../../backend/utils/activity/wait_event_names.txt'), output: wait_event_output, @@ -11,7 +11,7 @@ wait_event_target = custom_target('wait_event_names', ], build_by_default: true, install: true, - install_dir: [dir_include_server / 'utils', false], + install_dir: [dir_include_server / 'utils', false, false], ) wait_event_types_h = wait_event_target[0] diff --git a/src/include/utils/wait_event.h b/src/include/utils/wait_event.h index 3eebdfad38..009b03a520 100644 --- a/src/include/utils/wait_event.h +++ b/src/include/utils/wait_event.h @@ -63,6 +63,7 @@ extern void WaitEventExtensionShmemInit(void); extern Size WaitEventExtensionShmemSize(void); extern uint32 WaitEventExtensionNew(const char *wait_event_name); +extern char **GetWaitEventExtensionNames(int *nwaitevents); /* ---------- * pgstat_report_wait_start() - diff --git a/src/test/modules/worker_spi/t/001_worker_spi.pl b/src/test/modules/worker_spi/t/001_worker_spi.pl index 26b8a49bec..cd48f42269 100644 --- a/src/test/modules/worker_spi/t/001_worker_spi.pl +++ b/src/test/modules/worker_spi/t/001_worker_spi.pl @@ -47,6 +47,12 @@ $result = $node->poll_query_until( is($result, 1, 'dynamic bgworker has reported "worker_spi_main" as wait event'); +# Check the wait event used by the dynamic bgworker appears in pg_wait_event +$result = $node->safe_psql('postgres', + q[SELECT count(*) > 0 from pg_wait_event where type = 'Extension' and name = 'worker_spi_main';] +); +is($result, 't', '"worker_spi_main" is reported in pg_wait_event'); + note "testing bgworkers loaded with shared_preload_libraries"; # Create the database first so as the workers can connect to it when diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index e07afcd4aa..d69202991d 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -2631,6 +2631,10 @@ pg_views| SELECT n.nspname AS schemaname, FROM (pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'v'::"char"); +pg_wait_event| SELECT type, + name, + description + FROM pg_get_wait_events() we(type, name, description); SELECT tablename, rulename, definition FROM pg_rules WHERE schemaname = 'pg_catalog' ORDER BY tablename, rulename; diff --git a/src/test/regress/expected/sysviews.out b/src/test/regress/expected/sysviews.out index 001c6e7eb9..c1a7944c7a 100644 --- a/src/test/regress/expected/sysviews.out +++ b/src/test/regress/expected/sysviews.out @@ -134,6 +134,22 @@ select name, setting from pg_settings where name like 'enable%'; enable_tidscan | on (21 rows) +-- There are always wait event descriptions for various types. +select type, count(*) > 0 as ok FROM pg_wait_event + group by type order by type COLLATE "C"; + type | ok +-----------+---- + Activity | t + BufferPin | t + Client | t + Extension | t + IO | t + IPC | t + LWLock | t + Lock | t + Timeout | t +(9 rows) + -- Test that the pg_timezone_names and pg_timezone_abbrevs views are -- more-or-less working. We can't test their contents in any great detail -- without the outputs changing anytime IANA updates the underlying data, diff --git a/src/test/regress/sql/sysviews.sql b/src/test/regress/sql/sysviews.sql index 351e469c77..3d43108aae 100644 --- a/src/test/regress/sql/sysviews.sql +++ b/src/test/regress/sql/sysviews.sql @@ -55,6 +55,10 @@ select count(*) = 0 as ok from pg_stat_wal_receiver; -- a regression test run. select name, setting from pg_settings where name like 'enable%'; +-- There are always wait event descriptions for various types. +select type, count(*) > 0 as ok FROM pg_wait_event + group by type order by type COLLATE "C"; + -- Test that the pg_timezone_names and pg_timezone_abbrevs views are -- more-or-less working. We can't test their contents in any great detail -- without the outputs changing anytime IANA updates the underlying data, diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index c98a1e9f9a..a50f730260 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -588,7 +588,8 @@ sub GenerateFiles 'src/include/utils/wait_event_types.h', 'src/backend/utils/activity/wait_event_names.txt')) { - print "Generating pgstat_wait_event.c and wait_event_types.h...\n"; + print + "Generating pgstat_wait_event.c, wait_event_types.h and wait_event_funcs_data.c...\n"; my $activ = 'src/backend/utils/activity'; system( "perl $activ/generate-wait_event_types.pl --outdir $activ --code $activ/wait_event_names.txt" diff --git a/src/tools/msvc/clean.bat b/src/tools/msvc/clean.bat index 7cb23ea894..ac8da581e4 100755 --- a/src/tools/msvc/clean.bat +++ b/src/tools/msvc/clean.bat @@ -55,6 +55,7 @@ if exist src\include\catalog\header-stamp del /q src\include\catalog\header-stam if exist doc\src\sgml\version.sgml del /q doc\src\sgml\version.sgml if %DIST%==1 if exist src\backend\utils\activity\pgstat_wait_event.c del /q src\backend\utils\activity\pgstat_wait_event.c +if %DIST%==1 if exist src\backend\utils\activity\wait_event_funcs_data.c del /q src\backend\utils\activity\wait_event_funcs_data.c if %DIST%==1 if exist src\backend\utils\activity\wait_event_types.h del /q src\backend\utils\activity\wait_event_types.h if %DIST%==1 if exist src\backend\utils\fmgroids.h del /q src\backend\utils\fmgroids.h if %DIST%==1 if exist src\backend\utils\fmgrprotos.h del /q src\backend\utils\fmgrprotos.h -- 2.34.1
