PostgreSQL 15.2 has arrived – a detailed list of changes

PostgreSQL 15.2 has arrived – a detailed list of changes

Great news for Postgres fans. The latest version of the PostgreSQL database is now available. It offers state-of-the-art security and stability standards. In this article, we’ll lean into the changes in PostgreSQL 15.2.

Great news for Postgres fans. The latest version of the PostgreSQL database is now available. It offers state-of-the-art security and stability standards. In this article, we’ll lean into the changes in PostgreSQL 15.2.

First of all, it should be mentioned that the security vulnerability CVE-2022-41862 found in PostgreSQL versions 12 through 15 has been fixed. It allowed data breaches when connecting to a modified server using the Kerberos protocol. The whole thing was to be blamed on a properly crafted string sent by an unauthenticated server. Because of this, Kerberos libpq was reading too much data from the cache when establishing transport encryption. The PostgreSQL team declares that the vulnerability was not a threat if the gssencmode option was disabled or simply the Kerberos credential cache was missing.

Changes in a nutshell

In recent months, the Postgres team has fixed more than 60 bugs. The changes mainly concern fixes to MERGE, commands in psql or correct statistics generation. Version 15.2 also optimized key components to help with database replication. Now replication with hot_standby option enabled is faster. In addition, new features have been added, such as aborting full text search queries and adding the WITH RECURSIVE ... CYCLE ability to access the result column SET. For a full list of changes, with their original descriptions and authors, see the Detailed Changes section.

Support for previous versions

Before we present the detailed changes for PostgreSQL 15.2, it is worth mentioning that the Postgres development team is mindful of older versions of its database. So, most of the changes we are talking about today have their counterparts in versions 11 through 14. We also remind you that support for PostgreSQL 10 databases ended in November 2022. Therefore, it is worth considering the question of an upgrade. To do so, we recommend reading our article dedicated to this issue.

Detailed list of changes

The authors of the fixes, creating a request for their incorporation into PostgreSQL, are to fill out a submission form, which includes information about the changes they have made. The form includes such fields as: “What the patch does in a short paragraph,” meaning in a few words what change has been made, as well as “how to use the new feature” and “effect your patch has on performance.” The latter can be collectively referred to as additional information about the changes. The table below shows the original entries by the authors.


Change Additional info Author/Authors
Record and check the collation version of each database This feature is designed to detect collation version changes to avoid index corruption. Function pg_database_collation_actual_version() reports the underlying operating system collation version, and ALTER DATABASE … REFRESH sets the recorded database collation version to match the operating system collation version. Peter Eisentraut
Allow ICU collations to be set as the default for clusters and databases Previously, only libc-based collations could be selected at the cluster and database levels. ICU collations could only be used via explicit COLLATE clauses. Peter Eisentraut
Add system view pg_ident_file_mappings to report pg_ident.conf information Julien Rouhaud
Server – partitioning
Change Additional info Author/Authors
Improve planning time for queries referencing partitioned tables This change helps when only a few of many partitions are relevant. David Rowley
Allow ordered scans of partitions to avoid sorting in more cases Previously, a partitioned table with a DEFAULT partition or a LIST partition containing multiple values could not be used for ordered partition scans. Now they can be used if such partitions are pruned during planning. David Rowley
Improve foreign key behavior of updates on partitioned tables that move rows between partitions Previously, such updates ran a delete action on the source partition and an insert action on the target partition. PostgreSQL will now run an update action on the partition root, providing cleaner semantics. Amit Langote
Allow CLUSTER on partitioned tables Justin Pryzby
Fix ALTER TRIGGER RENAME on partitioned tables to properly rename triggers on all partitions Also prohibit cloned triggers from being renamed. Arne Roland, Álvaro Herrera
Server – indexes
Change Additional info Author/Authors
Allow btree indexes on system and TOAST tables to efficiently store duplicates Previously de-duplication was disabled for these types of indexes. Peter Geoghegan
Improve lookup performance of GiST indexes that were built using sorting Aliaksandr Kalenik, Sergei Shoulbakov, Andrey Borodin
Allow unique constraints and indexes to treat NULL values as not distinct Previously NULL entries were always treated as distinct values, but this can now be changed by creating constraints and indexes using UNIQUE NULLS NOT DISTINCT. Peter Eisentraut
Allow the ^@ starts-with operator and the starts_with() function to use btree indexes if using the C collation Previously these could only use SP-GiST indexes. Tom Lane
Server – optimization
Change Additional info Author/Authors
Allow extended statistics to record statistics for a parent with all its children Regular statistics already tracked parent and parent-plus-all-children statistics separately. Tomas Vondra, Justin Pryzby
Add server variable recursive_worktable_factor to allow the user to specify the expected size of the working table of a recursive query Simon Riggs
Server – general performance
Change Additional info Author/Authors
Allow hash lookup for NOT IN clauses with many constants Previously the code always sequentially scanned the list of values. David Rowley, James Coleman
Allow SELECT DISTINCT to be parallelized David Rowley
Speed up encoding validation of UTF-8 text by processing 16 bytes at a time This will improve text-heavy operations like COPY FROM. John Naylor, Heikki Linnakangas
Improve performance for sorts that exceed work_mem When the sort data no longer fits in work_mem, switch to a batch sorting algorithm that uses more output streams than before. Heikki Linnakangas
Improve performance and reduce memory consumption of in-memory sorts Ronan Dunklau, David Rowley, Thomas Munro, John Naylor
Allow WAL full page writes to use LZ4 and Zstandard compression This is controlled by the wal_compression server setting. Andrey Borodin, Justin Pryzby
Add support for writing WAL using direct I/O on macOS This only works if max_wal_senders = 0 and wal_level = minimal. Thomas Munro
Allow vacuum to be more aggressive in setting the oldest frozen and multi transaction id Peter Geoghegan
Allow a query referencing multiple foreign tables to perform parallel foreign table scans in more cases Andrey Lepikhov, Etsuro Fujita
Improve the performance of window functions that use row_number(), rank(), dense_rank() and count() David Rowley
Improve the performance of spinlocks on high-core-count ARM64 systems Geoffrey Blake
Server – monitoring
Change Additional info Author/Authors
Enable default logging of checkpoints and slow autovacuum operations This changes the default of log_checkpoints to on and that of log_autovacuum_min_duration to 10 minutes. This will cause even an idle server to generate some log output, which might cause problems on resource-constrained servers without log file rotation. These defaults should be changed in such cases. Bharath Rupireddy
Generate progress messages in the server log during slow server starts The messages report the cause of the delay. The time interval for notification is controlled by the new server variable log_startup_progress_interval. Nitin Jadhav, Robert Haas
Store cumulative statistics system data in shared memory Previously this data was sent to a statistics collector process via UDP packets, and could only be read by sessions after transferring it via the file system. There is no longer a separate statistics collector process. Kyotaro Horiguchi, Andres Freund, Melanie Plageman
Add additional information to VACUUM VERBOSE and autovacuum logging messages Peter Geoghegan
Add EXPLAIN (BUFFERS) output for temporary file block I/O Masahiko Sawada
Allow log output in JSON format The new setting is log_destination = jsonlog. Sehrope Sarkuni, Michael Paquier
Allow pg_stat_reset_single_table_counters() to reset the counters of relations shared across all databases Sadhuprasad Patro
Add wait events for local shell commands The new wait events are used when calling archive_command, archive_cleanup_command, restore_command and recovery_end_command. Fujii Masao
Server – access
Change Additional info Author/Authors
Allow table accesses done by a view to optionally be controlled by privileges of the view’s caller Previously, view accesses were always treated as being done by the view’s owner. That’s still the default. Christoph Heiss
Allow members of the pg_write_server_files predefined role to perform server-side base backups Previously only superusers could perform such backups. Dagfinn Ilmari Mannsåker
Allow GRANT to grant permissions to change individual server variables via SET and ALTER SYSTEM The new function has_parameter_privilege() reports on this privilege. Mark Dilger
Add predefined role pg_checkpoint that allows members to run CHECKPOINT Previously checkpoints could only be run by superusers. Jeff Davis
Allow members of the pg_read_all_stats predefined role to access the views pg_backend_memory_contexts and pg_shmem_allocations Previously these views could only be accessed by superusers. Bharath Rupireddy
Allow GRANT to grant permissions on pg_log_backend_memory_contexts() Previously this function could only be run by superusers. Jeff Davis
Server – configuration
Change Additional info Author/Authors
Add server variable shared_memory_size to report the size of allocated shared memory Nathan Bossart
Add server variable shared_memory_size_in_huge_pages to report the number of huge memory pages required This is only supported on Linux. Nathan Bossart
Honor server variable shared_preload_libraries in single-user mode This change supports use of shared_preload_libraries to load custom access methods and WAL resource managers, which would be essential for database access even in single-user mode. Jeff Davis
On Solaris, make the default setting of dynamic_shared_memory_type be sysv The previous default choice, posix, can result in spurious failures on this platform. Thomas Munro
Allow postgres -C to properly report runtime-computed values Previously runtime-computed values data_checksums, wal_segment_size, and data_directory_mode would report values that would not be accurate on the running server. However, this does not work on a running server. Nathan Bossart

Replication and restoration

Change Additional info Author/Authors
Add support for LZ4 and Zstandard compression of server-side base backups Jeevan Ladhe, Robert Haas
Run the checkpointer and bgwriter processes during crash recovery This helps to speed up long crash recoveries. Thomas Munro
Allow WAL processing to pre-fetch needed file contents This is controlled by the server variable recovery_prefetch. Thomas Munro
Allow archiving via loadable modules Previously, archiving was only done by calling shell commands. The new server variable archive_library can be set to specify a library to be called for archiving. Nathan Bossart
No longer require IDENTIFY_SYSTEM to be run before START_REPLICATION Jeff Davis
Replication and restoration – logical replication
Change Additional info Author/Authors
Allow publication of all tables in a schema For example, this syntax is now supported: CREATE PUBLICATION pub1 FOR TABLES IN SCHEMA s1,s2. ALTER PUBLICATION supports a similar syntax. Tables added later to the listed schemas will also be replicated. Vignesh C, Hou Zhijie, Amit Kapila
Allow publication content to be filtered using a WHERE clause Rows not satisfying the WHERE clause are not published. Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian, Tomas Vondra, Amit Kapila
Allow publication content to be restricted to specific columns Tomas Vondra, Álvaro Herrera, Rahila Syed
Allow skipping of transactions on a subscriber using ALTER SUBSCRIPTION … SKIP Masahiko Sawada
Add support for prepared (two-phase) transactions to logical replication The new CREATE_REPLICATION_SLOT option is called TWO_PHASE. pg_recvlogical now supports a new –two-phase option during slot creation. Peter Smith, Ajin Cherian, Amit Kapila, Nikhil Sontakke, Stas Kelvich
Prevent logical replication of empty transactions Previously, publishers would send empty transactions to subscribers if subscribed tables were not modified. Ajin Cherian, Hou Zhijie, Euler Taveira
Add SQL functions to monitor the directory contents of logical replication slots The new functions are pg_ls_logicalsnapdir(), pg_ls_logicalmapdir(), and pg_ls_replslotdir(). They can be run by members of the predefined pg_monitor role. Bharath Rupireddy
Allow subscribers to stop the application of logical replication changes on error This is enabled with the subscriber option disable_on_error and avoids possible infinite error loops during stream application. Osumi Takamichi, Mark Dilger
Adjust subscriber server variables to match the publisher so datetime and float8 values are interpreted consistently Some publishers might be relying on inconsistent behavior. Japin Li
Add system view pg_stat_subscription_stats to report on subscriber activity The new function pg_stat_reset_subscription_stats() allows resetting these statistics counters. Masahiko Sawada
Suppress duplicate entries in the pg_publication_tables system view In some cases a partition could appear more than once. Hou Zhijie

Utility commands

Change Additional info Author/Authors
Add SQL MERGE command to adjust one table to match another This is similar to INSERT … ON CONFLICT but more batch-oriented. Simon Riggs, Pavan Deolasee, Álvaro Herrera, Amit Langote
Add support for HEADER option in COPY text format The new option causes the column names to be output, and optionally verified on input. Rémi Lapeyre
Add new WAL-logged method for database creation This is the new default method for copying the template database, as it avoids the need for checkpoints during database creation. However, it might be slow if the template database is large, so the old method is still available. Dilip Kumar
Allow CREATE DATABASE to set the database OID Shruthi Gowda, Antonin Houska
Prevent DROP DATABASE, DROP TABLESPACE, and ALTER DATABASE SET TABLESPACE from occasionally failing during concurrent use on Windows Thomas Munro
Allow foreign key ON DELETE SET actions to affect only specified columns Previously, all of the columns in the foreign key were always affected. Paul Martinez
Allow ALTER TABLE to modify a table’s ACCESS METHOD Justin Pryzby, Jeff Davis
Properly call object access hooks when ALTER TABLE causes table rewrites Michael Paquier
Allow creation of unlogged sequences Peter Eisentraut
Track dependencies on individual columns in the results of functions returning composite types Previously, if a view or rule contained a reference to a specific column within the result of a composite-returning function, that was not noted as a dependency; the view or rule was only considered to depend on the composite type as a whole. This meant that dropping the individual column would be allowed, causing problems in later use of the view or rule. The column-level dependency is now also noted, so that dropping such a column will be rejected unless the view is changed or dropped. Tom Lane

Data types

Change Additional info Author/Authors
Allow the scale of a numeric value to be negative, or greater than its precision This allows rounding of values to the left of the decimal point, e.g., ‘1234’::numeric(4, -2) returns 1200. Dean Rasheed, Tom Lane
Improve overflow detection when casting values to interval Joe Koshakow
Change the I/O format of type “char” for non-ASCII characters Tom Lane
Update the display width information of modern Unicode characters, like emojis Also update from Unicode 5.0 to 14.0.0. There is now an automated way to keep Postgres updated with Unicode releases. Jacob Champion


Change Additional info Author/Authors
Add multirange input to range_agg() Paul Jungwirth
Add MIN() and MAX() aggregates for the xid8 data type Ken Kato
Add regular expression functions for compatibility with other relational systems The new functions are regexp_count(), regexp_instr(), regexp_like(), and regexp_substr(). Some new optional arguments were also added to regexp_replace(). Gilles Darold, Tom Lane
Add the ability to compute the distance between polygons Tom Lane
Add to_char() format codes of, tzh, and tzm The upper-case equivalents of these were already supported. Nitin Jadhav
When applying AT TIME ZONE to a time with time zone value, use the transaction start time rather than wall clock time to determine whether DST applies This allows the conversion to be considered stable rather than volatile, and it saves a kernel call per invocation. Aleksander Alekseev, Tom Lane
Ignore NULL array elements in ts_delete() and setweight() functions with array arguments These functions effectively ignore empty-string array elements (since those could never match a valid lexeme). It seems consistent to let them ignore NULL elements too, instead of failing. Jean-Christophe Arnu
Add support for petabyte units to pg_size_pretty() and pg_size_bytes() David Christensen
Change pg_event_trigger_ddl_commands() to output references to other sessions’ temporary schemas using the actual schema name Previously this function reported all temporary schemas as pg_temp, but it’s misleading to use that for any but the current session’s temporary schema. Tom Lane


Change Additional info Author/Authors
Fix enforcement of PL/pgSQL variable CONSTANT markings Previously, a variable could be used as a CALL output parameter or refcursor OPEN variable despite being marked CONSTANT. Tom Lane


Change Additional info Author/Authors
Allow IP address matching against a server certificate’s Subject Alternative Name Jacob Champion
Allow PQsslAttribute() to report the SSL library type without requiring a libpq connection Jacob Champion
Change query cancellations sent by the client to use the same TCP settings as normal client connections This allows configured TCP timeouts to apply to query cancel connections. Jelte Fennema
Prevent libpq event callback failures from forcing an error result Tom Lane

Client applications

Change Additional info Author/Authors
Allow pgbench to retry after serialization and deadlock failures Yugo Nagata, Marina Polyakova
Client applications – psql
Change Additional info Author/Authors
Improve performance of psql’s \copy command, by sending data in larger chunks Heikki Linnakangas
Add \dconfig command to report server variables This is similar to the server-side SHOW command, but it can process patterns to show multiple variables conveniently. Mark Dilger, Tom Lane
Add \getenv command to assign the value of an environment variable to a psql variable Tom Lane
Add + option to the \lo_list and \dl commands to show large-object privileges Pavel Luzanov
Add a pager option for the \watch command This is only supported on Unix and is controlled by the PSQL_WATCH_PAGER environment variable. Pavel Stehule, Thomas Munro
Make psql include intra-query double-hyphen comments in queries sent to the server Previously such comments were removed from the query before being sent. Double-hyphen comments that are before any query text are not sent, and are not recorded as separate psql history entries. Tom Lane, Greg Nancarrow
Adjust psql so that Readline’s meta-# command will insert a double-hyphen comment marker Previously a pound marker was inserted, unless the user had taken the trouble to configure a non-default comment marker. Tom Lane
Make psql output all results when multiple queries are passed to the server at once Previously, only the last query result was displayed. The old behavior can be restored by setting the SHOW_ALL_RESULTS psql variable to off. Fabien Coelho
After an error is detected in –single-transaction mode, change the final COMMIT command to ROLLBACK only if ON_ERROR_STOP is set Previously, detection of an error in a -c command or -f script file would lead to issuing ROLLBACK at the end, regardless of the value of ON_ERROR_STOP. Michael Paquier
Improve psql’s tab completion Shinya Kato, Dagfinn Ilmari Mannsåker, Peter Smith, Koyu Tanigawa, Ken Kato, David Fetter, Haiying Tang, Peter Eisentraut, Álvaro Herrera, Tom Lane, Masahiko Sawada
Limit support of psql’s backslash commands to servers running PostgreSQL 9.2 or later Remove code that was only used when running with an older server. Commands that do not require any version-specific adjustments compared to 9.2 will still work. Tom Lane
Client applications – pg_dump
Change Additional info Author/Authors
Make pg_dump dump public schema ownership changes and security labels Noah Misch
Improve performance of dumping databases with many objects This will also improve the performance of pg_upgrade. Tom Lane
Improve parallel pg_dump’s performance for tables with large TOAST tables Tom Lane
Add dump/restore option –no-table-access-method to force restore to only use the default table access method Justin Pryzby
Limit support of pg_dump and pg_dumpall to servers running PostgreSQL 9.2 or later Tom Lane

Server applications

Change Additional info Author/Authors
Add new pg_basebackup option –target to control the base backup location The new options are server to write the backup locally and blackhole to discard the backup (for testing). Robert Haas
Allow pg_basebackup to do server-side gzip, LZ4, and Zstandard compression and client-side LZ4 and Zstandard compression of base backup files Client-side gzip compression was already supported. Dipesh Pandit, Jeevan Ladhe
Allow pg_basebackup to compress on the server side and decompress on the client side before storage This is accomplished by specifying compression on the server side and plain output format. Dipesh Pandit
Allow pg_basebackup’s –compress option to control the compression location (server or client), compression method, and compression options Michael Paquier, Robert Haas
Add the LZ4 compression method to pg_receivewal This is enabled via –compress=lz4 and requires binaries to be built using –with-lz4. Georgios Kokolatos
Add additional capabilities to pg_receivewal’s –compress option Georgios Kokolatos
Improve pg_receivewal’s ability to restart at the proper WAL location Previously, pg_receivewal would start based on the WAL file stored in the local archive directory, or at the sending server’s current WAL flush location. With this change, if the sending server is running Postgres 15 or later, the local archive directory is empty, and a replication slot is specified, the replication slot’s restart point will be used. Ronan Dunklau
Add pg_rewind option –config-file to simplify use when server configuration files are stored outside the data directory Gunnar Bluth
Server applications – pg_upgrade
Change Additional info Author/Authors
Store pg_upgrade’s log and temporary files in a subdirectory of the new cluster called pg_upgrade_output.d Previously such files were left in the current directory, requiring manual cleanup. Now they are automatically removed on successful completion of pg_upgrade. Justin Pryzby
Disable default status reporting during pg_upgrade operation if the output is not a terminal The status reporting output can be enabled for non-tty usage by using –verbose. Andres Freund
Make pg_upgrade report all databases with invalid connection settings Previously only the first database with an invalid connection setting was reported. Jeevan Ladhe
Make pg_upgrade preserve tablespace and database OIDs, as well as relation relfilenode numbers Shruthi Gowda, Antonin Houska
Add a –no-sync option to pg_upgrade This is recommended only for testing. Michael Paquier
Limit support of pg_upgrade to old servers running PostgreSQL 9.2 or later Tom Lane
Server applications – pg_waldump
Change Additional info Author/Authors
Allow pg_waldump output to be filtered by relation file node, block number, fork number, and full page images David Christensen, Thomas Munro
Make pg_waldump report statistics before an interrupted exit For example, issuing a control-C in a terminal running pg_waldump –stats –follow will report the current statistics before exiting. This does not work on Windows. Bharath Rupireddy
Improve descriptions of some transaction WAL records reported by pg_waldump Masahiko Sawada, Michael Paquier
Allow pg_waldump to dump information about multiple resource managers This is enabled by specifying the –rmgr option multiple times. Heikki Linnakangas


Change Additional info Author/Authors
Add documentation for pg_encoding_to_char() and pg_char_to_encoding() Ian Lawrence Barwick
Document the ^@ starts-with operator Tom Lane

Source code

Change Additional info Author/Authors
Add support for continuous integration testing using cirrus-ci Andres Freund, Thomas Munro, Melanie Plageman
Add configure option –with-zstd to enable Zstandard builds Jeevan Ladhe, Robert Haas, Michael Paquier
Add an ABI identifier field to the magic block in loadable libraries, allowing non-community PostgreSQL distributions to identify libraries that are not compatible with other builds An ABI field mismatch will generate an error at load time. Peter Eisentraut
Create a new pg_type.typcategory value for “char” Some other internal-use-only types have also been assigned to this category. Tom Lane
Add new protocol message TARGET to specify a new COPY method to be used for base backups pg_basebackup now uses this method. Robert Haas
Add new protocol message COMPRESSION and COMPRESSION_DETAIL to specify the compression method and options Robert Haas
Remove server support for old BASE_BACKUP command syntax and base backup protocol Robert Haas
Add support for extensions to set custom backup targets Robert Haas
Allow extensions to define custom WAL resource managers Jeff Davis
Add function pg_settings_get_flags() to get the flags of server variables Justin Pryzby
On Windows, export all the server’s global variables using PGDLLIMPORT markers Previously, only specific variables were accessible to extensions on Windows. Robert Haas
Require GNU make version 3.81 or later to build PostgreSQL Tom Lane
Require OpenSSL to build the pgcrypto extension Peter Eisentraut
Require Perl version 5.8.3 or later Dagfinn Ilmari Mannsåker
Require Python version 3.2 or later Andres Freund

Additional modules

Change Additional info Author/Authors
Allow amcheck to check sequences Mark Dilger
Improve amcheck sanity checks for TOAST tables Mark Dilger
Add new module basebackup_to_shell as an example of a custom backup target Robert Haas
Add new module basic_archive as an example of performing archiving via a library Nathan Bossart
Allow btree_gist indexes on boolean columns These can be used for exclusion constraints. Emre Hasegeli
Fix pageinspect’s page_header() to handle 32-kilobyte page sizes Previously, improper negative values could be returned in certain cases. Quan Zongliang
Add counters for temporary file block I/O to pg_stat_statements Masahiko Sawada
Add JIT counters to pg_stat_statements Magnus Hagander
Add new module pg_walinspect This gives SQL-level output similar to pg_waldump. Bharath Rupireddy
Indicate the permissive/enforcing state in sepgsql log messages Dave Page
Additional modules – postgres_fdw
Change Additional info Author/Authors
Allow postgres_fdw to push down CASE expressions Alexander Pyhalov
Add server variable postgres_fdw.application_name to control the application name of postgres_fdw connections Previously the remote session’s application_name could only be set on the remote server or via a postgres_fdw connection specification. postgres_fdw.application_name supports some escape sequences for customization, making it easier to tell such connections apart on the remote server. Hayato Kuroda
Allow parallel commit on postgres_fdw servers This is enabled with the CREATE SERVER option parallel_commit. Etsuro Fujita


Considering the continuous development and attention to security issues on the highest level, we can rest assured about the future of PostgreSQL. On the other hand, those who are not satisfied with the capabilities of Postgres alone, we encourage you to get acquainted with the database platform EuroDB, whose features significantly extend the standard capabilities of PostgreSQL. EuroDB is fully compatible with PostgreSQL and offers professional technical support for users of this database engine. It is an ideal tool for any database administrator.


The blog articles are written by people from the EuroLinux team. We owe 80% of the content to our developers, the rest is prepared by the sales or marketing department. We make every effort to ensure that the content is the best in terms of content and language, but we are not infallible. If you see anything that needs to be corrected or clarified, we'd love to hear from you.