|From:||David Fetter <david(at)fetter(dot)org>|
|To:||PostgreSQL Announce <pgsql-announce(at)postgresql(dot)org>|
|Subject:||== PostgreSQL Weekly News - June 21, 2020 ==|
|Views:||Raw Message | Whole Thread | Download mbox | Resend email|
== PostgreSQL Weekly News - June 21, 2020 ==
== PostgreSQL Jobs for June ==
== PostgreSQL Local ==
PGDay Ukraine will take place September 5th, 2020 in Lviv at the Bank Hotel.
pgDay Israel 2020 will take place on September 10, 2020 in Tel Aviv.
PGDay Austria will take place September 18, 2020 at Schloss Schoenbrunn
(Apothekertrakt) in Vienna.
PG Day Russia will take place in Saint Petersburg on July 9, 2021.
== PostgreSQL in the News ==
Planet PostgreSQL: http://planet.postgresql.org/
PostgreSQL Weekly News is brought to you this week by David Fetter
Submit news and announcements by Sunday at 3:00pm PST8PDT to david(at)fetter(dot)org(dot)
== Applied Patches ==
Thomas Munro pushed:
- Doc: Add references for SI and SSI. Our documentation failed to point out that
REPEATABLE READ is really snapshot isolation, which might be important to some
users. Point to the standard reference paper for this complicated topic.
Likewise, add a reference to the VLDB paper about PostgreSQL SSI, for
technical information about our SSI implementation and how it compares to
S2PL. While here, add a note about catalog access using a lower isolation
level, per recent user complaint. Back-patch to all releases. Reported-by:
Kyle Kingsbury <aphyr(at)jepsen(dot)io> Reviewed-by: Andres Freund
<andres(at)anarazel(dot)de> Reviewed-by: Peter Geoghegan <pg(at)bowt(dot)ie> Reviewed-by:
Tatsuo Ishii <ishii(at)sraoss(dot)co(dot)jp> Discussion:
- Fix buffile.c error handling. Convert buffile.c error handling to use ereport.
This fixes cases where I/O errors were indistinguishable from EOF or not
reported. Also remove "%m" from error messages where errno would be bogus.
While we're modifying those strings, add block numbers and short read byte
counts where appropriate. Back-patch to all supported releases. Reported-by:
Amit Khandekar <amitdkhan(dot)pg(at)gmail(dot)com> Reviewed-by: Melanie Plageman
<melanieplageman(at)gmail(dot)com> Reviewed-by: Alvaro Herrera
<alvherre(at)2ndquadrant(dot)com> Reviewed-by: Robert Haas <robertmhaas(at)gmail(dot)com>
Reviewed-by: Ibrar Ahmed <ibrar(dot)ahmad(at)gmail(dot)com> Reviewed-by: Michael Paquier
- Make BufFileWrite() void. It now either returns after it wrote all the data
you gave it, or raises an error. Not done in back-branches, because it might
cause problems for external code. Discussion:
- Remove useless variable.
Michaël Paquier pushed:
- Bump catversion for ACL changes on replication origin functions. Oversight in
cc07264. Reported-by: Tom Lane Discussion:
- Fix some comments referring to past features. Timestamp can only be an int64
since b9d092c, and support for WITH OIDS has been removed as of 578b229.
Author: Justin Pryzby Discussion:
- Remove reset of testtablespace from pg_regress on Windows. testtablespace is
an extra path used as tablespace location in the main regression test suite,
computed from --outputdir as defined by the caller of pg_regress (current
directory if undefined). This special handling was introduced as of f10589e
to be specific to MSVC, as we let pg_regress' Makefile handle this cleanup in
other environments. This moves the cleanup to the MSVC script running
regression tests instead where needed: check, installcheck and upgradecheck.
I have also checked this patch on MSVC with repeated runs of each target.
Author: Kyotaro Horiguchi, Michael Paquier Discussion:
- Fix oldest xmin and LSN computation across repslots after advancing. Advancing
a replication slot did not recompute the oldest xmin and LSN values across
replication slots, preventing resource removal like segments not recycled at
checkpoint time. The original commit that introduced the slot advancing in
9c7d06d never did the update of those oldest values, and b0afdca removed this
code. This commit adds a TAP test to check segment recycling with advancing
for physical slots, enforcing an extra segment switch before advancing to
check if the segment gets correctly recycled after a checkpoint. Reported-by:
Andres Freund Reviewed-by: Alexey Kondratov, Kyptaro Horiguchi Discussion:
Peter Eisentraut pushed:
- Error message refactoring. Take some untranslatable things out of the message
and replace by format placeholders, to reduce translatable strings and reduce
- pg_dump: Unbreak dumping of aggregates from very old server versions. Recently
broken by d9fa17aa7c34dea66ce64da6fb4c643e75ba452c.
- doc: Document factorial function. This has existed for a very long time,
equivalent to the ! and !! operators, but it was never documented.
Reviewed-by: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> Discussion:
- Fix file reference in nls.mk. Broken by move of fe_archive.c to fe_utils.
- Remove STATUS_WAITING. Add a separate enum for use in the locking APIs, which
were the only user. Discussion:
- Disallow factorial of negative numbers. The previous implementation returned 1
for all negative numbers, which is not sensible under any definition.
- Expand tests for factorial. Move from int4 to numeric test. (They were
originally int4 functions, but were reimplemented for numeric in
04a4821adef38155b7920ba9eb83c4c3c29156f8.) Add some tests for edge cases.
Tom Lane pushed:
- Fix power() for infinity inputs some more. Buildfarm results for commit
decbe2bfb show that AIX and illumos have non-POSIX-compliant pow() functions,
as do ancient NetBSD and HPUX releases. While it's dubious how much we should
care about the latter two platforms, the former two are probably enough reason
to put in manual handling of infinite-input cases. Hence, do so, and clean up
the post-pow() error handling to reflect its now-more-limited scope.
(Notably, while we no longer expect to ever see EDOM from pow(), report it as
a domain error if we do. The former coding had the net effect of expensively
converting the error to ERANGE, which seems highly questionable: if pow()
wanted to report ERANGE, it would have done so.) Patch by me; thanks to
Michael Paquier for review. Discussion:
- Fix power() for large inputs yet more. Buildfarm results for commit e532b1d57
reveal the error in my thinking about the unexpected-EDOM case. I'd supposed
this was no longer really a live issue, but it seems the fix for glibc's bug
#3866 is not all that old, and we still have at least one buildfarm animal
(lapwing) with the bug. Hence, resurrect essentially the previous logic (but,
I hope, less opaquely presented), and explain what it is we're really doing
here. Also, blindly try to fix fossa's failure by tweaking the logic that
figures out whether y is an odd integer when x is -inf. This smells a whole
lot like a compiler bug, but I lack access to icc to try to pin it down.
Maybe doing division instead of multiplication will dodge the issue.
- In dpow(), remove redundant check for whether y is an integer. I failed to
notice that we don't really need to check for y being an integer in the code
path where x = -inf; we already did. Also make some further cosmetic
rearrangements in that spot in hopes of dodging the seeming compiler bug that
buildfarm member fossa is hitting. And be consistent about declaring
variables as "float8" not "double", since the pre-existing variables in this
function are like that. Discussion:
- Lobotomize test for float -Inf ^ -2, at least for now. Per POSIX this case
should produce +0, but buildfarm member fossa (with icc (ICC) 126.96.36.1991
20190815) is reporting -0. icc has a boatload of unsafe floating-point
optimizations, with a corresponding boatload of not-too-well-documented
compiler switches, and it seems our default use of "-mp1" isn't whacking it
hard enough to keep it from misoptimizing the stanza in dpow() that checks
whether y is odd. There's nothing wrong with that code (seeing that no other
buildfarm member has trouble with it), so I'm content to blame this on the
compiler. But without access to the compiler I'm not going to guess at what
switches might be needed to fix it. For now, tweak the test case so it will
accept either -0 or +0 as a correct answer. Discussion:
- Doc: fix copy-and-pasteo in ecpg docs. The synopsis for PGTYPESinterval_free()
used the wrong name. Discussion:
- Sync our copy of the timezone library with IANA release tzcode2020a. This
absorbs a leap-second-related bug fix in localtime.c, and teaches zic to
handle an expiration marker in the leapseconds file. Neither are of any
interest to us (for the foreseeable future anyway), but we need to stay more
or less in sync with upstream. Also adjust some over-eager changes in the
README from commit 957338418. I have no intention of making changes that
require C99 in this code, until such time as all the live back branches
require C99. Otherwise back-patching will get too exciting. For the same
reason, absorb assorted whitespace and other cosmetic changes from HEAD into
the back branches; mostly this reflects use of improved versions of pgindent.
All in all then, quite a boring update. But I figured I'd get it done while I
was looking at this code.
- Doc: document POSIX-style time zone specifications in full. We'd glossed over
most of this complexity for years, but it's hard to avoid writing it all down
now, so that we can explain what happens when there's no "posixrules" file in
the IANA time zone database. That was at best a tiny minority situation till
now, but it's likely to become quite common in the future, so we'd better
explain it. Nonetheless, we don't really encourage people to use POSIX zone
specs; picking a named zone is almost always what you really want, unless
perhaps you're stuck with an out-of-date zone database. Therefore, let's
shove all this detail into an appendix. Patch by me; thanks to Robert Haas
for help with some awkward wording. Discussion:
- Future-proof regression tests against possibly-missing posixrules file. The
IANA time zone folk have deprecated use of a "posixrules" file in the tz
database. While for now it's our choice whether to keep supplying one in our
own builds, installations built with --with-system-tzdata will soon be needing
to cope with that file not being present, at least on some platforms. This
causes a problem for the horology test, which expected the nonstandard POSIX
zone spec "CST7CDT" to apply pre-2007 US daylight savings rules. That does
happen if the posixrules file supplies such information, but otherwise the
test produces undesired results. To fix, add an explicit transition date rule
that matches 2005 practice. (We could alternatively have switched the test to
use some real time zone, but it seems useful to have coverage of this type of
zone spec.) While at it, update a documentation example that also relied on
"CST7CDT"; use a real-world zone name instead. Also, document why the zone
names EST5EDT, CST6CDT, MST7MDT, PST8PDT aren't subject to similar failures
when "posixrules" is missing. Back-patch to all supported branches, since the
hazard is the same for all. Discussion:
Robert Haas pushed:
- Assorted cleanup of tar-related code. Introduce TAR_BLOCK_SIZE and replace
many instances of 512 with the new constant. Introduce function
tarPaddingBytesRequired and use it to replace numerous repetitions of (x +
511) & ~511. Add preprocessor guards against multiple inclusion to pgtar.h.
Reformat the prototype for tarCreateHeader so it doesn't extend beyond 80
- Don't export basebackup.c's sendTablespace(). Commit
72d422a5227ef6f76f412486a395aba9f53bf3f0 made xlog.c call sendTablespace()
with the 'sizeonly' argument set to true, which required basebackup.c to
export sendTablespace(). However, that's kind of ugly, so instead defer the
call to sendTablespace() until basebackup.c regains control. That way, it can
still be a static function. Patch by me, reviewed by Amit Kapila and Kyotaro
- Minor code cleanup for perform_base_backup(). Merge two calls to sendDir()
that are exactly the same except for the fifth argument. Adjust comments to
match. Also, don't bother checking whether tblspc_map_file is NULL. We
initialize it in all cases, so it can't be. Patch by me, reviewed by Amit
Kapila and Kyotaro Horiguchi. Discussion:
- Improve server code to read files as part of a base backup. Don't use fread(),
since that doesn't necessarily set errno. We could use read() instead, but
it's even better to use pg_pread(), which allows us to avoid some extra calls
to seek to the desired location in the file. Also, advertise a wait event
while reading from a file, as we do for most other places where we're reading
data from files. Patch by me, reviewed by Hamid Akhtar. Discussion:
Bruce Momjian pushed:
- pg_upgrade: set vacuum_defer_cleanup_age to zero. Non-zero
vacuum_defer_cleanup_age values cause pg_upgrade freezing of the system
catalogs to be incomplete, or do nothing. This will cause the upgrade to fail
in confusing ways. Reported-by: Laurenz Albe Discussion:
Andres Freund pushed:
- Avoid potential spinlock in a signal handler as part of global barriers. On
platforms without support for 64bit atomic operations where we also cannot
rely on 64bit reads to have single copy atomicity, such atomics are
implemented using a spinlock based fallback. That means it's not safe to even
read such atomics from within a signal handler (since the signal handler might
run when the spinlock already is held). To avoid this issue defer global
barrier processing out of the signal handler. Instead of checking local /
shared barrier generation to determine whether to set
ProcSignalBarrierPending, introduce PROCSIGNAL_BARRIER and always set
ProcSignalBarrierPending when receiving such a signal. Additionally avoid
redundant work in ProcessProcSignalBarrier if ProcSignalBarrierPending is
unnecessarily. Also do a small amount of other polishing. Author: Andres
Freund Reviewed-By: Robert Haas Discussion:
Backpatch: 13-, where the code was introduced.
- spinlock emulation: Fix bug when more than INT_MAX spinlocks are initialized.
Once the counter goes negative we ended up with spinlocks that errored out on
first use (due to check in tas_sema). Author: Andres Freund Reviewed-By:
Robert Haas Discussion:
- Add basic spinlock tests to regression tests. As s_lock_test, the already
existing test for spinlocks, isn't run in an automated fashion (and doesn't
test a normal backend environment), adding tests that are run as part of a
normal regression run is a good idea. Particularly in light of several recent
and upcoming spinlock related fixes. Currently the new tests are run as part
of the pre-existing test_atomic_ops() test. That perhaps can be quibbled
about, but for now seems ok. The only operations that s_lock_test tests but
the new tests don't are the detection of a stuck spinlock and S_LOCK_FREE
(which is otherwise unused, not implemented on all platforms, and will be
removed). This currently contains a test for more than INT_MAX spinlocks
(only run with --disable-spinlocks), to ensure the recent commit fixing a bug
with more than INT_MAX spinlock initializations is correct. That test is
somewhat slow, so we might want to disable it after a few days. It might be
worth retiring s_lock_test after this. The added coverage of a stuck spinlock
probably isn't worth the added complexity? Author: Andres Freund Discussion:
- Fix deadlock danger when atomic ops are done under spinlock. This was a danger
only for --disable-spinlocks in combination with atomic operations unsupported
by the current platform. While atomics.c was careful to signal that a
separate semaphore ought to be used when spinlock emulation is active, spin.c
didn't actually implement that mechanism. That's my (Andres') fault, it seems
to have gotten lost during the development of the atomic operations support.
Fix that issue and add test for nesting atomic operations inside a spinlock.
Author: Andres Freund Discussion:
- Clean up includes of s_lock.h. Users of spinlocks should use spin.h, not
s_lock.h. And lwlock.h hasn't utilized spinlocks for quite a while.
Peter Geoghegan pushed:
- Fix nbtree.h dedup state comment. Oversight in commit 0d861bbb.
- Fix deduplication "single value" strategy bug. It was possible for
deduplication's single value strategy to mistakenly believe that a very small
duplicate tuple counts as one of the six large tuples that it aims to leave
behind after the page finally splits. This could cause slightly suboptimal
space utilization with very low cardinality indexes, though only under fairly
narrow conditions. To fix, be particular about what kind of tuple counts as a
maxpostingsize-capped tuple. This avoids confusion in the event of a small
tuple that gets "wedged" between two large tuples, where all tuples on the
page are duplicates of the same value. Discussion:
Backpatch: 13-, where deduplication was introduced (by commit 0d861bbb)
- Doc: Tweak description of B-Tree duplicate tuples. Defining duplicates as
"close by" to each other was unclear. Simplify the definition. Backpatch:
13-, where deduplication was introduced (by commit 0d861bbb)
David Rowley pushed:
- Fix EXPLAIN ANALYZE for parallel HashAgg plans. Since 1f39bce02, HashAgg nodes
have had the ability to spill to disk when memory consumption exceeds
work_mem. That commit added new properties to EXPLAIN ANALYZE to show the
maximum memory usage and disk usage, however, it didn't quite go as far as
showing that information for parallel workers. Since workers may have
experienced something very different from the main process, we should show
this information per worker, as is done in Sort. Reviewed-by: Justin Pryzby
Reviewed-by: Jeff Davis Discussion:
Backpatch-through: 13, where the hashagg spilling code was added.
Fujii Masao pushed:
- Fix issues in invalidation of obsolete replication slots. This commit fixes
the following issues. 1. There is the case where the slot is dropped while
trying to invalidate it. InvalidateObsoleteReplicationSlots() did not
handle this case, and which could cause checkpoint to fail. 2.
InvalidateObsoleteReplicationSlots() could emit the same log message
multiple times unnecessary. It should be logged only once. 3. When marking
the slot as used, we always searched the target slot from all the
replication slots even if we already found it. This could cause useless
waste of cycles. Back-patch to v13 where these issues were added as a part of
max_slot_wal_keep_size code. Author: Fujii Masao Reviewed-by: Kyotaro
Horiguchi, Alvaro Herrera Discussion:
Álvaro Herrera pushed:
- Adjust some glossary terms. Mostly in response to Jürgen Purtz critique of
previous definitions, though I added many other changes. Author: Álvaro
Herrera <alvherre(at)alvh(dot)no-ip(dot)org> Reviewed-by: Jürgen Purtz <juergen(at)purtz(dot)de>
Reviewed-by: Justin Pryzby <pryzby(at)telsasoft(dot)com> Reviewed-by: Erik Rijkers
- Ensure write failure reports no-disk-space. A few places calling fwrite and
gzwrite were not setting errno to ENOSPC when reporting errors, as is
customary; this led to some failures being reported as "could not write file:
Success" which makes us look silly. Make a few of these places in pg_dump and
pg_basebackup use our customary pattern. Backpatch-to: 9.5 Author: Justin
Pryzby <pryzby(at)telsasoft(dot)com> Author: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> Author:
Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> Discussion:
Amit Kapila pushed:
- Removal unused function parameter in CopyReadBinaryAttribute. The function
parameter column_no is not used in CopyReadBinaryAttribute, this can be
removed. Commit 0e319c7ad7 removed the usage of column_no parameter in
function CopyReadBinaryAttribute but forgot to remove the parameter.
Reported-by: Vignesh C Author: Vignesh C Discussion:
Noah Misch pushed:
- Remove dead forceSync parameter of XactLogCommitRecord(). The function has
been reading global variable forceSyncCommit, mirroring the intent of the
caller that passed forceSync=forceSyncCommit. The other caller,
RecordTransactionCommitPrepared(), passed false. Since COMMIT PREPARED can't
share a transaction with any command, it certainly doesn't share a transaction
with a command that sets forceSyncCommit. Reviewed by Michael Paquier.
Alexander Korotkov pushed:
- Add documentation for opclass options. 911e7020770 added opclass options and
adjusted documentation for each particular affected opclass. However,
documentation for extendability was not adjusted. This commit adjusts
documentation for interfaces of index AMs and opclasses. Discussion:
Author: Alexander Korotkov Reported-by: Peter Geoghegan Reviewed-by: Peter
- Fix masking of SP-GiST pages during xlog consistency check. spg_mask() didn't
take into account that pd_lower equal to SizeOfPageHeaderData is still valid
value. This commit fixes that. Backpatch to 11, where spg_mask() pg_lower
check was introduced. Reported-by: Michael Paquier Discussion:
https://postgr.es/m/20200615131405.GM52676%40paquier.xyz Backpatch-through: 11
- Minor corrections to docs related to opclass options. Reported-by: Peter
- Language fixes for docs related to opclass options. Discussion:
https://postgr.es/m/20200620232145.GB17995%40telsasoft.com Author: Justin
Pryzby Backpatch-through: 13
== Pending Patches ==
Thomas Munro sent in another revision of a patch to enable SERIALIZABLE READ
ONLY DEFERRABLE on streaming replicas, add a perl module for isolation-like
testing, and add a test for SERIALIZABLE on streaming replicas.
Mark Wong sent in a patch to implement an example PL handler.
Peter Eisentraut sent in another revision of a patch to implement SEARCH and
CYCLE clauses for common table expressions.
Surafel Temesgen sent in a patch to make it possible to add WHERE clauses in
Michaël Paquier sent in a patch to make it possible to read symbolic links on
Win32 in TAP tests.
Andres Freund and Magnus Hagander traded patches to clean up some unfortunate
choices of wording from the code base.
Peter Eisentraut sent in a patch to document the factorial function, expand the
tests for same, and disallow factorials of negative numbers.
Bharath Rupireddy and Vigneshwaran C traded patches to implement parallel COPY.
Ashutosh Bapat and Andrey V. Lepikhov traded patches to speed up COPY FROM for
the case of tables with foreign partitions.
Kyotaro HORIGUCHI, Fujii Masao, and Álvaro Herrera traded patches to fix some
issues in GetWALAvailability().
Kyotaro HORIGUCHI and Michaël Paquier traded patches to make the
pg_stat_replication view consistent, and forcibly initialize lastRemovedSegNo at
the first checkpoint.
Bruce Momjian sent in a patch to clarify the fact that neither neither
configuration parameters nor GRANTs are copied from template databases.
Ranier Vilela sent in a patch to work around some failures to rename.
Georgios Kokolatos sent in two revisions of a patch to use the TableAm API in
Jeff Davis sent in a patch to fix a hashagg slowdown due to spill changes.
Michaël Paquier and Aleksey Kondratov traded patches to fix a bug that
manifested as a persistence failure in physical replication slot advance.
Andres Freund sent in a patch to fix some infelicities around spinlocks and
atomic operations thereunder.
Amul Sul sent in a patch to implement ALTER SYSTEM READ ONLY.
Aleksey Kondratov and Justin Pryzby traded patches to document operator class
David Zhang sent in a patch to enable people to run the regression tests by
using either 'vcregress contribcheck' or 'vcregress contribcheck postgres_fdw'
to test extensions directly.
Thomas Munro sent in another revision of a patch to use MinimalTuple for tuple
Kirk Jamison sent in another revision of a patch to optimize dropping of
relation buffers using dlist.
Noah Misch sent in a patch to remove dead forceSync parameter of
Pavel Stěhule sent in another revision of a patch to make calling PL/pgsql
stored procedures more efficient.
Jehan-Guillaume de Rorthais sent in a patch to implement DEMOTE.
Álvaro Herrera and Jürgen Purtz traded patches to add a glossary.
Michaël Paquier sent in another revision of a patch to fix a bug that manifested
as pg_regress cleans up tablespace twice.
David G. Johnston sent in a patch to fix some bugs in DROP ... IF EXISTS and add
some documentation and tests.
Bertrand Drouvot sent in a patch to add information during standby recovery
Dilip Kumar sent in another revision of a patch to fix some infelicities between
logical_work_mem and logical streaming of large in-progress transactions.
Steven Winfield sent in a patch to mark the btree_gist functions as PARALLEL
Nathan Bossart sent in another revision of a patch to add support for
INDEX_CLEANUP and TRUNCATE to vacuumdb.
Vigneshwaran C sent in a patch to clean up and remove an unused function
parameter from CopyReadBinaryAttribute.
Vyacheslav Makarov sent in a patch to make it possible to specify restart_lsn in
David Rowley sent in two revisions of a patch to add in some missing HashAgg
EXPLAIN ANALYZE details for parallel plans.
Thomas Munro sent in another revision of a patch to preallocate some DSM space
David Rowley sent in two more revisions of a patch to allocate bigger io chunks
for parallel seqscan.
Ryo Matsumura sent in a patch to fix a bug that manifested as archive status
".ready" files may be created too early.
Peter Eisentraut sent in a patch to clean up grammar of substring() and
overlay() a bit, and adds the current regular expression syntax to substring().
Thomas Munro sent in another revision of a patch to cache smgrnblocks() results
Justin Pryzby sent in a patch to clarify the documentation of replication slots.
Noah Misch sent in a patch to raise the three "stop limit" values beyond which
only single-user mode will assign new values of a certain counter.
Fabien COELHO sent in a patch to fix some tag typos in "catalog.sgml".
Peter Eisentraut sent in a patch to rename enable_incrementalsort to
Josef Šimánek sent in another revision of a patch to implement progress
reporting for the COPY command.
Dagfinn Ilmari Mannsåker sent in a patch to add missing <application> tags in
application doc <refentrytitle>s, and add <command> to SQL command
Dagfinn Ilmari Mannsåker sent in two revisions of a patch to add missing
cross-links in system catalog documentation, and make SQL command names in the
catalog documentation into links.
|Next Message||Hans-Jürgen Schönig||2020-06-24 09:04:37||CYPEX 1.0 is released|
|Previous Message||David Fetter||2020-06-15 03:33:15||== PostgreSQL Weekly News - June 14, 2020 ==|