Revert 0f5ca02f53
authorAlexander Korotkov <akorotkov@postgresql.org>
Wed, 8 Apr 2020 08:37:27 +0000 (11:37 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Wed, 8 Apr 2020 08:37:27 +0000 (11:37 +0300)
0f5ca02f53 introduces 3 new keywords.  It appears to be too much for relatively
small feature.  Given now we past feature freeze, it's already late for
discussion of the new syntax.  So, revert.

Discussion: https://postgr.es/m/28209.1586294824%40sss.pgh.pa.us

20 files changed:
doc/src/sgml/ref/begin.sgml
doc/src/sgml/ref/start_transaction.sgml
src/backend/access/transam/xlog.c
src/backend/commands/Makefile
src/backend/commands/wait.c [deleted file]
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/outfuncs.c
src/backend/parser/gram.y
src/backend/storage/ipc/ipci.c
src/backend/storage/lmgr/proc.c
src/backend/tcop/utility.c
src/backend/utils/adt/misc.c
src/include/commands/wait.h [deleted file]
src/include/nodes/nodes.h
src/include/nodes/parsenodes.h
src/include/parser/kwlist.h
src/include/utils/timestamp.h
src/test/recovery/t/020_begin_wait.pl [deleted file]
src/tools/pgindent/typedefs.list

index 66d9ad7cb234b8115bbf1c2b6f1ffe26ea6e7959..c23bbfb4e711c3f8c7df8939f862d050dadc0b85 100644 (file)
@@ -21,7 +21,7 @@ PostgreSQL documentation
 
  <refsynopsisdiv>
 <synopsis>
-BEGIN [ WORK | TRANSACTION ] [ <replaceable class="parameter">transaction_mode</replaceable> [, ...] ] [ WAIT FOR LSN <replaceable class="parameter">lsn_value</replaceable> [TIMEOUT <replaceable class="parameter">number_of_milliseconds</replaceable> ] ]
+BEGIN [ WORK | TRANSACTION ] [ <replaceable class="parameter">transaction_mode</replaceable> [, ...] ]
 
 <phrase>where <replaceable class="parameter">transaction_mode</replaceable> is one of:</phrase>
 
@@ -63,17 +63,6 @@ BEGIN [ WORK | TRANSACTION ] [ <replaceable class="parameter">transaction_mode</
    <xref linkend="sql-set-transaction"/>
    was executed.
   </para>
-
-  <para>
-   The <literal>WAIT FOR</literal> clause allows to wait for the target log
-   sequence number (<acronym>LSN</acronym>) to be replayed on standby before
-   starting the transaction in <productname>PostgreSQL</productname> databases
-   with master-standby asynchronous replication. Wait time can be limited by
-   specifying a timeout, which is measured in milliseconds and must be a positive
-   integer. If <acronym>LSN</acronym> was not reached before timeout, transaction
-   doesn't begin. Waiting can be interrupted by cancelling
-   <literal>BEGIN</literal> command.
-  </para>
  </refsect1>
 
  <refsect1>
@@ -157,10 +146,6 @@ BEGIN;
    different purpose in embedded SQL. You are advised to be careful
    about the transaction semantics when porting database applications.
   </para>
-
-  <para>
-   There is no <literal>WAIT FOR</literal> clause in the SQL standard.
-  </para>
  </refsect1>
 
  <refsect1>
index b94ab00b403202eb66914dac5a3659bb403a06a0..d6cd1d41779216ea600faf9501805dae6344e392 100644 (file)
@@ -21,7 +21,7 @@ PostgreSQL documentation
 
  <refsynopsisdiv>
 <synopsis>
-START TRANSACTION [ <replaceable class="parameter">transaction_mode</replaceable> [, ...] ] [ WAIT FOR LSN <replaceable class="parameter">lsn_value</replaceable> [TIMEOUT <replaceable class="parameter">number_of_milliseconds</replaceable> ] ]
+START TRANSACTION [ <replaceable class="parameter">transaction_mode</replaceable> [, ...] ]
 
 <phrase>where <replaceable class="parameter">transaction_mode</replaceable> is one of:</phrase>
 
@@ -40,17 +40,6 @@ START TRANSACTION [ <replaceable class="parameter">transaction_mode</replaceable
    characteristics, as if <xref linkend="sql-set-transaction"/> was executed. This is the same
    as the <xref linkend="sql-begin"/> command.
   </para>
-
-  <para>
-   The <literal>WAIT FOR</literal> clause allows to wait for the target log
-   sequence number (<acronym>LSN</acronym>) to be replayed on standby before
-   starting the transaction in <productname>PostgreSQL</productname> databases
-   with master-standby asynchronous replication. Wait time can be limited by
-   specifying a timeout, which is measured in milliseconds and must be a positive
-   integer. If <acronym>LSN</acronym> was not reached before timeout, transaction
-   doesn't begin. Waiting can be interrupted by cancelling
-   <literal>START TRANSACTION</literal> command.
-  </para>
  </refsect1>
 
  <refsect1>
@@ -89,10 +78,6 @@ START TRANSACTION [ <replaceable class="parameter">transaction_mode</replaceable
    omitted.
   </para>
 
-  <para>
-   There is no <literal>WAIT FOR</literal> clause in the SQL standard.
-  </para>
-
   <para>
    See also the compatibility section of <xref linkend="sql-set-transaction"/>.
   </para>
index 8a4c1743e55ad0f4030f3355c44ca7557931f812..740d7044b1d50eab5aad478e48ab84247b0e3d31 100644 (file)
@@ -42,7 +42,6 @@
 #include "catalog/pg_database.h"
 #include "commands/progress.h"
 #include "commands/tablespace.h"
-#include "commands/wait.h"
 #include "common/controldata_utils.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
@@ -7157,7 +7156,6 @@ StartupXLOG(void)
                        do
                        {
                                bool            switchedTLI = false;
-                               XLogRecPtr      minWaitedLSN;
 
 #ifdef WAL_DEBUG
                                if (XLOG_DEBUG ||
@@ -7361,17 +7359,6 @@ StartupXLOG(void)
                                        break;
                                }
 
-                               /*
-                                * If we replayed an LSN that someone was waiting for, set
-                                * latches in shared memory array to notify the waiter.
-                                */
-                               minWaitedLSN = WaitLSNGetMin();
-                               if (!XLogRecPtrIsInvalid(minWaitedLSN) &&
-                                       minWaitedLSN <= XLogCtl->lastReplayedEndRecPtr)
-                               {
-                                       WaitLSNSetLatch(XLogCtl->lastReplayedEndRecPtr);
-                               }
-
                                /* Else, try to fetch the next WAL record */
                                record = ReadRecord(xlogreader, LOG, false);
                        } while (record != NULL);
index 9b310926c12b690fa8a26e546085daa311b30474..d4815d3ce659a2984f033043a7e13b0f6001a9dd 100644 (file)
@@ -57,7 +57,6 @@ OBJS = \
        user.o \
        vacuum.o \
        variable.o \
-       view.o \
-       wait.o
+       view.o
 
 include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/commands/wait.c b/src/backend/commands/wait.c
deleted file mode 100644 (file)
index b7aee5b..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * wait.c
- *       Implements WAIT FOR clause for BEGIN and START TRANSACTION commands.
- *       This clause allows waiting for given LSN to be replayed on standby.
- *
- * Copyright (c) 2020, PostgreSQL Global Development Group
- *
- * IDENTIFICATION
- *       src/backend/commands/wait.c
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-#include <math.h>
-
-#include "access/xlog.h"
-#include "access/xlogdefs.h"
-#include "commands/wait.h"
-#include "funcapi.h"
-#include "miscadmin.h"
-#include "pgstat.h"
-#include "storage/backendid.h"
-#include "storage/pmsignal.h"
-#include "storage/proc.h"
-#include "storage/shmem.h"
-#include "storage/sinvaladt.h"
-#include "storage/spin.h"
-#include "utils/builtins.h"
-#include "utils/pg_lsn.h"
-#include "utils/timestamp.h"
-
-/*
- * Shared memory structure representing information about LSNs, which backends
- * are waiting for replay.
- */
-typedef struct
-{
-       slock_t         mutex;                  /* mutex protecting the fields below */
-       int                     max_backend_id; /* max backend_id present in lsns[] */
-       pg_atomic_uint64 min_lsn;       /* minimal waited LSN */
-       /* per-backend array of waited LSNs */
-       XLogRecPtr      lsns[FLEXIBLE_ARRAY_MEMBER];
-}                      WaitLSNState;
-
-static WaitLSNState * state;
-
-/*
- * Add the wait event of the current backend to shared memory array
- */
-static void
-WaitLSNAdd(XLogRecPtr lsn_to_wait)
-{
-       SpinLockAcquire(&state->mutex);
-       if (state->max_backend_id < MyBackendId)
-               state->max_backend_id = MyBackendId;
-
-       state->lsns[MyBackendId] = lsn_to_wait;
-
-       if (lsn_to_wait < state->min_lsn.value)
-               state->min_lsn.value = lsn_to_wait;
-       SpinLockRelease(&state->mutex);
-}
-
-/*
- * Delete wait event of the current backend from the shared memory array.
- */
-void
-WaitLSNDelete(void)
-{
-       int                     i;
-       XLogRecPtr      deleted_lsn;
-
-       SpinLockAcquire(&state->mutex);
-
-       deleted_lsn = state->lsns[MyBackendId];
-       state->lsns[MyBackendId] = InvalidXLogRecPtr;
-
-       /* If we are deleting the minimal LSN, then choose the next min_lsn */
-       if (!XLogRecPtrIsInvalid(deleted_lsn) &&
-               deleted_lsn == state->min_lsn.value)
-       {
-               state->min_lsn.value = InvalidXLogRecPtr;
-               for (i = 2; i <= state->max_backend_id; i++)
-               {
-                       if (!XLogRecPtrIsInvalid(state->lsns[i]) &&
-                               (state->lsns[i] < state->min_lsn.value ||
-                                XLogRecPtrIsInvalid(state->min_lsn.value)))
-                       {
-                               state->min_lsn.value = state->lsns[i];
-                       }
-               }
-       }
-
-       /* If deleting from the end of the array, shorten the array's used part */
-       if (state->max_backend_id == MyBackendId)
-       {
-               for (i = (MyBackendId); i >= 2; i--)
-                       if (!XLogRecPtrIsInvalid(state->lsns[i]))
-                       {
-                               state->max_backend_id = i;
-                               break;
-                       }
-       }
-
-       SpinLockRelease(&state->mutex);
-}
-
-/*
- * Report amount of shared memory space needed for WaitLSNState
- */
-Size
-WaitLSNShmemSize(void)
-{
-       Size            size;
-
-       size = offsetof(WaitLSNState, lsns);
-       size = add_size(size, mul_size(MaxBackends + 1, sizeof(XLogRecPtr)));
-       return size;
-}
-
-/*
- * Initialize an shared memory structure for waiting for LSN
- */
-void
-WaitLSNShmemInit(void)
-{
-       bool            found;
-       uint32          i;
-
-       state = (WaitLSNState *) ShmemInitStruct("pg_wait_lsn",
-                                                                                        WaitLSNShmemSize(),
-                                                                                        &found);
-       if (!found)
-       {
-               SpinLockInit(&state->mutex);
-
-               for (i = 0; i < (MaxBackends + 1); i++)
-                       state->lsns[i] = InvalidXLogRecPtr;
-
-               state->max_backend_id = 0;
-               pg_atomic_init_u64(&state->min_lsn, InvalidXLogRecPtr);
-       }
-}
-
-/*
- * Set latches in shared memory to signal that new LSN has been replayed
- */
-void
-WaitLSNSetLatch(XLogRecPtr cur_lsn)
-{
-       uint32          i;
-       int                     max_backend_id;
-       PGPROC     *backend;
-
-       SpinLockAcquire(&state->mutex);
-       max_backend_id = state->max_backend_id;
-
-       for (i = 2; i <= max_backend_id; i++)
-       {
-               backend = BackendIdGetProc(i);
-
-               if (backend && state->lsns[i] != 0 &&
-                       state->lsns[i] <= cur_lsn)
-               {
-                       SetLatch(&backend->procLatch);
-               }
-       }
-       SpinLockRelease(&state->mutex);
-}
-
-/*
- * Get minimal LSN that some backend is waiting for
- */
-XLogRecPtr
-WaitLSNGetMin(void)
-{
-       return state->min_lsn.value;
-}
-
-/*
- * On WAIT use a latch to wait till LSN is replayed, postmaster dies or timeout
- * happens. Timeout is specified in milliseconds.  Returns true if LSN was
- * reached and false otherwise.
- */
-bool
-WaitLSNUtility(XLogRecPtr target_lsn, const int timeout_ms)
-{
-       XLogRecPtr      cur_lsn;
-       int                     latch_events;
-       float8          endtime;
-       bool            res = false;
-       bool            wait_forever = (timeout_ms <= 0);
-
-       endtime = GetNowFloat() + timeout_ms / 1000.0;
-
-       latch_events = WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH;
-
-       /* Check if we already reached the needed LSN */
-       cur_lsn = GetXLogReplayRecPtr(NULL);
-       if (cur_lsn >= target_lsn)
-               return true;
-
-       WaitLSNAdd(target_lsn);
-       ResetLatch(MyLatch);
-
-       /* Recheck if LSN was reached while WaitLSNAdd() and ResetLatch() */
-       cur_lsn = GetXLogReplayRecPtr(NULL);
-       if (cur_lsn >= target_lsn)
-               return true;
-
-       for (;;)
-       {
-               int                     rc;
-               float8          time_left = 0;
-               long            time_left_ms = 0;
-
-               time_left = endtime - GetNowFloat();
-
-               /* Use 1 second as the default timeout to check for interrupts */
-               if (wait_forever || time_left < 0 || time_left > 1.0)
-                       time_left_ms = 1000;
-               else
-                       time_left_ms = (long) ceil(time_left * 1000.0);
-
-               /* If interrupt, LockErrorCleanup() will do WaitLSNDelete() for us */
-               CHECK_FOR_INTERRUPTS();
-
-               /* If postmaster dies, finish immediately */
-               if (!PostmasterIsAlive())
-                       break;
-
-               rc = WaitLatch(MyLatch, latch_events, time_left_ms,
-                                          WAIT_EVENT_CLIENT_READ);
-
-               ResetLatch(MyLatch);
-
-               if (rc & WL_LATCH_SET)
-                       cur_lsn = GetXLogReplayRecPtr(NULL);
-
-               if (rc & WL_TIMEOUT)
-               {
-                       time_left = endtime - GetNowFloat();
-                       /* If the time specified by user has passed, stop waiting */
-                       if (!wait_forever && time_left <= 0.0)
-                               break;
-                       cur_lsn = GetXLogReplayRecPtr(NULL);
-               }
-
-               /* If LSN has been replayed */
-               if (target_lsn <= cur_lsn)
-                       break;
-       }
-
-       WaitLSNDelete();
-
-       if (cur_lsn < target_lsn)
-               ereport(WARNING,
-                               (errcode(ERRCODE_IN_FAILED_SQL_TRANSACTION),
-                                errmsg("didn't start transaction because LSN was not reached"),
-                                errhint("Try to increase wait timeout.")));
-       else
-               res = true;
-
-       return res;
-}
-
-/*
- * Implementation of WAIT FOR clause for BEGIN and START TRANSACTION commands
- */
-int
-WaitLSNMain(WaitClause *stmt, DestReceiver *dest)
-{
-       TupleDesc       tupdesc;
-       TupOutputState *tstate;
-       XLogRecPtr      target_lsn;
-       bool            res = false;
-
-       target_lsn = DatumGetLSN(DirectFunctionCall1(pg_lsn_in,
-                                                                                                CStringGetDatum(stmt->lsn)));
-       res = WaitLSNUtility(target_lsn, stmt->timeout);
-
-       /* Need a tuple descriptor representing a single TEXT column */
-       tupdesc = CreateTemplateTupleDesc(1);
-       TupleDescInitEntry(tupdesc, (AttrNumber) 1, "LSN reached", TEXTOID, -1, 0);
-
-       /* Prepare for projection of tuples */
-       tstate = begin_tup_output_tupdesc(dest, tupdesc, &TTSOpsMinimalTuple);
-
-       /* Send the result */
-       do_text_output_oneline(tstate, res ? "t" : "f");
-       end_tup_output(tstate);
-       return res;
-}
index db179becab5e274d51625f4e174a8397be5dff17..1525c0de7258e31583aedb9a230d48273698928d 100644 (file)
@@ -3748,22 +3748,10 @@ _copyTransactionStmt(const TransactionStmt *from)
        COPY_STRING_FIELD(savepoint_name);
        COPY_STRING_FIELD(gid);
        COPY_SCALAR_FIELD(chain);
-       COPY_NODE_FIELD(wait);
 
        return newnode;
 }
 
-static WaitClause *
-_copyWaitClause(const WaitClause *from)
-{
-       WaitClause *newnode = makeNode(WaitClause);
-
-       COPY_STRING_FIELD(lsn);
-       COPY_SCALAR_FIELD(timeout);
-
-       return newnode;
-};
-
 static CompositeTypeStmt *
 _copyCompositeTypeStmt(const CompositeTypeStmt *from)
 {
@@ -5351,9 +5339,6 @@ copyObjectImpl(const void *from)
                case T_TransactionStmt:
                        retval = _copyTransactionStmt(from);
                        break;
-               case T_WaitClause:
-                       retval = _copyWaitClause(from);
-                       break;
                case T_CompositeTypeStmt:
                        retval = _copyCompositeTypeStmt(from);
                        break;
index 854d484f603458600443a2274c417a16872ba6d5..4f34189ab5cbf36c0da6240ddfa0305f99726686 100644 (file)
@@ -1541,16 +1541,6 @@ _equalTransactionStmt(const TransactionStmt *a, const TransactionStmt *b)
        COMPARE_STRING_FIELD(savepoint_name);
        COMPARE_STRING_FIELD(gid);
        COMPARE_SCALAR_FIELD(chain);
-       COMPARE_NODE_FIELD(wait);
-
-       return true;
-}
-
-static bool
-_equalWaitClause(const WaitClause *a, const WaitClause *b)
-{
-       COMPARE_STRING_FIELD(lsn);
-       COMPARE_SCALAR_FIELD(timeout);
 
        return true;
 }
@@ -3401,9 +3391,6 @@ equal(const void *a, const void *b)
                case T_TransactionStmt:
                        retval = _equalTransactionStmt(a, b);
                        break;
-               case T_WaitClause:
-                       retval = _equalWaitClause(a, b);
-                       break;
                case T_CompositeTypeStmt:
                        retval = _equalCompositeTypeStmt(a, b);
                        break;
index 57b508cc6a1cd71dc117dc464855e6117ef005f9..bb1565467d43486f3453fbc0d1fa2e977440c4c1 100644 (file)
@@ -2786,28 +2786,6 @@ _outDefElem(StringInfo str, const DefElem *node)
        WRITE_LOCATION_FIELD(location);
 }
 
-static void
-_outTransactionStmt(StringInfo str, const TransactionStmt *node)
-{
-       WRITE_NODE_TYPE("TRANSACTIONSTMT");
-
-       WRITE_STRING_FIELD(savepoint_name);
-       WRITE_STRING_FIELD(gid);
-       WRITE_NODE_FIELD(options);
-       WRITE_BOOL_FIELD(chain);
-       WRITE_ENUM_FIELD(kind, TransactionStmtKind);
-       WRITE_NODE_FIELD(wait);
-}
-
-static void
-_outWaitClause(StringInfo str, const WaitClause *node)
-{
-       WRITE_NODE_TYPE("WAITCLAUSE");
-
-       WRITE_STRING_FIELD(lsn);
-       WRITE_UINT_FIELD(timeout);
-}
-
 static void
 _outTableLikeClause(StringInfo str, const TableLikeClause *node)
 {
@@ -4358,12 +4336,6 @@ outNode(StringInfo str, const void *obj)
                        case T_PartitionRangeDatum:
                                _outPartitionRangeDatum(str, obj);
                                break;
-                       case T_TransactionStmt:
-                               _outTransactionStmt(str, obj);
-                               break;
-                       case T_WaitClause:
-                               _outWaitClause(str, obj);
-                               break;
 
                        default:
 
index ea1084fa3cf55d283721ef0e846cb5e850da5878..1219ac8c26494df560e7ba47217073bbb069bf1e 100644 (file)
@@ -601,8 +601,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <partboundspec> PartitionBoundSpec
 %type <list>           hash_partbound
 %type <defelt>         hash_partbound_elem
-%type <ival>           wait_time
-%type <node>           wait_for
 
 /*
  * Non-keyword token types.  These are hard-wired into the "flex" lexer.
@@ -672,7 +670,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 
        LABEL LANGUAGE LARGE_P LAST_P LATERAL_P
        LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL
-       LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED LSN
+       LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED
 
        MAPPING MATCH MATERIALIZED MAXVALUE METHOD MINUTE_P MINVALUE MODE MONTH_P MOVE
 
@@ -703,7 +701,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
        SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P
 
        TABLE TABLES TABLESAMPLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN
-       TIES TIME TIMEOUT TIMESTAMP TO TRAILING TRANSACTION TRANSFORM
+       TIES TIME TIMESTAMP TO TRAILING TRANSACTION TRANSFORM
        TREAT TRIGGER TRIM TRUE_P
        TRUNCATE TRUSTED TYPE_P TYPES_P
 
@@ -713,8 +711,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
        VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
        VERBOSE VERSION_P VIEW VIEWS VOLATILE
 
-       WAIT WHEN WHERE WHITESPACE_P WINDOW
-       WITH WITHIN WITHOUT WORK WRAPPER WRITE
+       WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WRAPPER WRITE
 
        XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLNAMESPACES
        XMLPARSE XMLPI XMLROOT XMLSERIALIZE XMLTABLE
@@ -9958,20 +9955,18 @@ TransactionStmt:
                                        n->chain = $3;
                                        $$ = (Node *)n;
                                }
-                       | BEGIN_P opt_transaction transaction_mode_list_or_empty wait_for
+                       | BEGIN_P opt_transaction transaction_mode_list_or_empty
                                {
                                        TransactionStmt *n = makeNode(TransactionStmt);
                                        n->kind = TRANS_STMT_BEGIN;
                                        n->options = $3;
-                                       n->wait = $4;
                                        $$ = (Node *)n;
                                }
-                       | START TRANSACTION transaction_mode_list_or_empty wait_for
+                       | START TRANSACTION transaction_mode_list_or_empty
                                {
                                        TransactionStmt *n = makeNode(TransactionStmt);
                                        n->kind = TRANS_STMT_START;
                                        n->options = $3;
-                                       n->wait = $4;
                                        $$ = (Node *)n;
                                }
                        | COMMIT opt_transaction opt_transaction_chain
@@ -14245,25 +14240,6 @@ xml_passing_mech:
                        | BY VALUE_P
                ;
 
-/*
- * WAIT FOR clause of BEGIN and START TRANSACTION statements
- */
-wait_for:
-                       WAIT FOR LSN Sconst wait_time
-                               {
-                                       WaitClause *n = makeNode(WaitClause);
-                                       n->lsn = $4;
-                                       n->timeout = $5;
-                                       $$ = (Node *)n;
-                               }
-                       | /* EMPTY */           { $$ = NULL; }
-               ;
-
-wait_time:
-                       TIMEOUT Iconst          { $$ = $2; }
-                       | /* EMPTY */           { $$ = 0; }
-               ;
-
 
 /*
  * Aggregate decoration clauses
@@ -15415,7 +15391,6 @@ unreserved_keyword:
                        | LOCK_P
                        | LOCKED
                        | LOGGED
-                       | LSN
                        | MAPPING
                        | MATCH
                        | MATERIALIZED
@@ -15543,7 +15518,6 @@ unreserved_keyword:
                        | TEMPORARY
                        | TEXT_P
                        | TIES
-                       | TIMEOUT
                        | TRANSACTION
                        | TRANSFORM
                        | TRIGGER
@@ -15570,7 +15544,6 @@ unreserved_keyword:
                        | VIEW
                        | VIEWS
                        | VOLATILE
-                       | WAIT
                        | WHITESPACE_P
                        | WITHIN
                        | WITHOUT
index 417840a8f1149e62740bddd7ad82ccaf27b1ea83..427b0d59cde2cc02e2aa48ff45186f858cfe038b 100644 (file)
@@ -22,7 +22,6 @@
 #include "access/subtrans.h"
 #include "access/twophase.h"
 #include "commands/async.h"
-#include "commands/wait.h"
 #include "miscadmin.h"
 #include "pgstat.h"
 #include "postmaster/autovacuum.h"
@@ -148,7 +147,6 @@ CreateSharedMemoryAndSemaphores(void)
                size = add_size(size, BTreeShmemSize());
                size = add_size(size, SyncScanShmemSize());
                size = add_size(size, AsyncShmemSize());
-               size = add_size(size, WaitLSNShmemSize());
 #ifdef EXEC_BACKEND
                size = add_size(size, ShmemBackendArraySize());
 #endif
@@ -266,11 +264,6 @@ CreateSharedMemoryAndSemaphores(void)
        SyncScanShmemInit();
        AsyncShmemInit();
 
-       /*
-        * Init array of Latches in shared memory for WAIT
-        */
-       WaitLSNShmemInit();
-
 #ifdef EXEC_BACKEND
 
        /*
index 04a5d595e4d982542e7350d9842c25fa4a95b8d5..5aa19d3f78169107eee7ba4eb61231c961ec0124 100644 (file)
@@ -38,7 +38,6 @@
 #include "access/transam.h"
 #include "access/twophase.h"
 #include "access/xact.h"
-#include "commands/wait.h"
 #include "miscadmin.h"
 #include "pgstat.h"
 #include "postmaster/autovacuum.h"
@@ -718,9 +717,6 @@ LockErrorCleanup(void)
 
        AbortStrongLockAcquire();
 
-       /* If BEGIN WAIT FOR LSN was interrupted, then stop waiting for that LSN */
-       WaitLSNDelete();
-
        /* Nothing to do if we weren't waiting for a lock */
        if (lockAwaited == NULL)
        {
index f516bd22eae720f42d727c2ee0b0eb9d52fb23fd..b1f7f6e2d01d35e1dd21aa4518edef2184fe9c15 100644 (file)
@@ -57,7 +57,6 @@
 #include "commands/user.h"
 #include "commands/vacuum.h"
 #include "commands/view.h"
-#include "commands/wait.h"
 #include "miscadmin.h"
 #include "parser/parse_utilcmd.h"
 #include "postmaster/bgwriter.h"
@@ -592,18 +591,6 @@ standard_ProcessUtility(PlannedStmt *pstmt,
                                        case TRANS_STMT_START:
                                                {
                                                        ListCell   *lc;
-                                                       WaitClause *waitstmt = (WaitClause *) stmt->wait;
-
-                                                       /* WAIT FOR cannot be used on master */
-                                                       if (stmt->wait && !RecoveryInProgress())
-                                                               ereport(ERROR,
-                                                                               (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                                                                                errmsg("WAIT FOR can only be "
-                                                                                               "used on standby")));
-
-                                                       /* If needed to WAIT FOR something but failed */
-                                                       if (stmt->wait && WaitLSNMain(waitstmt, dest) == 0)
-                                                               break;
 
                                                        BeginTransactionBlock();
                                                        foreach(lc, stmt->options)
index 03f997cba704ab866f6f3c0dc33764229bc68880..ee340fb0f021bee659374ef589320b09601ceaac 100644 (file)
@@ -372,6 +372,8 @@ pg_sleep(PG_FUNCTION_ARGS)
         * less than the specified time when WaitLatch is terminated early by a
         * non-query-canceling signal such as SIGHUP.
         */
+#define GetNowFloat()  ((float8) GetCurrentTimestamp() / 1000000.0)
+
        endtime = GetNowFloat() + secs;
 
        for (;;)
diff --git a/src/include/commands/wait.h b/src/include/commands/wait.h
deleted file mode 100644 (file)
index 2a95c95..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * wait.h
- *       prototypes for commands/wait.c
- *
- * Copyright (c) 2020, PostgreSQL Global Development Group
- *
- * src/include/commands/wait.h
- *
- *-------------------------------------------------------------------------
- */
-#ifndef WAIT_H
-#define WAIT_H
-
-#include "tcop/dest.h"
-#include "nodes/parsenodes.h"
-
-extern bool WaitLSNUtility(XLogRecPtr lsn, const int timeout_ms);
-extern Size WaitLSNShmemSize(void);
-extern void WaitLSNShmemInit(void);
-extern void WaitLSNSetLatch(XLogRecPtr cur_lsn);
-extern XLogRecPtr WaitLSNGetMin(void);
-extern int     WaitLSNMain(WaitClause *stmt, DestReceiver *dest);
-extern void WaitLSNDelete(void);
-
-#endif                                                 /* WAIT_H */
index 822827aa32dcfee27b5cbec2e76fc832dc20571d..381d84b4e4f859e91d9b61de543a3344f06c769c 100644 (file)
@@ -492,7 +492,6 @@ typedef enum NodeTag
        T_StartReplicationCmd,
        T_TimeLineHistoryCmd,
        T_SQLCmd,
-       T_WaitClause,
 
        /*
         * TAGS FOR RANDOM OTHER STUFF
index 7ad3ddbf5795f293edc67ffc5a1874c943adee53..518abe42c1098ef86c6bd620ab129335f402718c 100644 (file)
@@ -1431,17 +1431,6 @@ typedef struct OnConflictClause
        int                     location;               /* token location, or -1 if unknown */
 } OnConflictClause;
 
-/*
- * WaitClause -
- *             representation of WAIT FOR clause for BEGIN and START TRANSACTION.
- */
-typedef struct WaitClause
-{
-       NodeTag         type;
-       char       *lsn;                        /* LSN to wait for */
-       int                     timeout;                /* Number of milliseconds to limit wait time */
-} WaitClause;
-
 /*
  * CommonTableExpr -
  *        representation of WITH list element
@@ -3071,7 +3060,6 @@ typedef struct TransactionStmt
        char       *savepoint_name; /* for savepoint commands */
        char       *gid;                        /* for two-phase-commit related commands */
        bool            chain;                  /* AND CHAIN option */
-       Node       *wait;                       /* WAIT FOR clause */
 } TransactionStmt;
 
 /* ----------------------
index 6e1848fe4cc3409006d3cbbf9ff59b4783149c6c..08f22ce211ddb6b44a8983fad41e51fba5cf560d 100644 (file)
@@ -243,7 +243,6 @@ PG_KEYWORD("location", LOCATION, UNRESERVED_KEYWORD)
 PG_KEYWORD("lock", LOCK_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("locked", LOCKED, UNRESERVED_KEYWORD)
 PG_KEYWORD("logged", LOGGED, UNRESERVED_KEYWORD)
-PG_KEYWORD("lsn", LSN, UNRESERVED_KEYWORD)
 PG_KEYWORD("mapping", MAPPING, UNRESERVED_KEYWORD)
 PG_KEYWORD("match", MATCH, UNRESERVED_KEYWORD)
 PG_KEYWORD("materialized", MATERIALIZED, UNRESERVED_KEYWORD)
@@ -411,7 +410,6 @@ PG_KEYWORD("text", TEXT_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("then", THEN, RESERVED_KEYWORD)
 PG_KEYWORD("ties", TIES, UNRESERVED_KEYWORD)
 PG_KEYWORD("time", TIME, COL_NAME_KEYWORD)
-PG_KEYWORD("timeout", TIMEOUT, UNRESERVED_KEYWORD)
 PG_KEYWORD("timestamp", TIMESTAMP, COL_NAME_KEYWORD)
 PG_KEYWORD("to", TO, RESERVED_KEYWORD)
 PG_KEYWORD("trailing", TRAILING, RESERVED_KEYWORD)
@@ -452,7 +450,6 @@ PG_KEYWORD("version", VERSION_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("view", VIEW, UNRESERVED_KEYWORD)
 PG_KEYWORD("views", VIEWS, UNRESERVED_KEYWORD)
 PG_KEYWORD("volatile", VOLATILE, UNRESERVED_KEYWORD)
-PG_KEYWORD("wait", WAIT, UNRESERVED_KEYWORD)
 PG_KEYWORD("when", WHEN, RESERVED_KEYWORD)
 PG_KEYWORD("where", WHERE, RESERVED_KEYWORD)
 PG_KEYWORD("whitespace", WHITESPACE_P, UNRESERVED_KEYWORD)
index eaeeb79c41189e47df677e09106fa09ad40d4f69..03a1de569f06fa8269aeb8eb324a4b4ce2a7e41f 100644 (file)
@@ -109,6 +109,4 @@ extern int  date2isoyearday(int year, int mon, int mday);
 
 extern bool TimestampTimestampTzRequiresRewrite(void);
 
-#define GetNowFloat() ((float8) GetCurrentTimestamp() / 1000000.0)
-
 #endif                                                 /* TIMESTAMP_H */
diff --git a/src/test/recovery/t/020_begin_wait.pl b/src/test/recovery/t/020_begin_wait.pl
deleted file mode 100644 (file)
index 3db25bd..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-# Checks for BEGIN WAIT FOR LSN
-use strict;
-use warnings;
-
-use PostgresNode;
-use TestLib;
-use Test::More tests => 8;
-
-# Initialize master node
-my $node_master = get_new_node('master');
-$node_master->init(allows_streaming => 1);
-$node_master->start;
-
-# And some content and take a backup
-$node_master->safe_psql('postgres',
-       "CREATE TABLE wait_test AS SELECT generate_series(1,10) AS a");
-my $backup_name = 'my_backup';
-$node_master->backup($backup_name);
-
-# Using the backup, create a streaming standby with a 1 second delay
-my $node_standby = get_new_node('standby');
-my $delay        = 1;
-$node_standby->init_from_backup($node_master, $backup_name,
-       has_streaming => 1);
-$node_standby->append_conf('postgresql.conf', qq[
-       recovery_min_apply_delay = '${delay}s'
-]);
-$node_standby->start;
-
-
-# Check that timeouts make us wait for the specified time (1s here)
-my $current_time = $node_standby->safe_psql('postgres', "SELECT now()");
-my $two_seconds = 2000; # in milliseconds
-my $start_time = time();
-$node_standby->safe_psql('postgres',
-       "BEGIN WAIT FOR LSN '0/FFFFFFFF' TIMEOUT $two_seconds");
-my $time_waited = (time() - $start_time) * 1000; # convert to milliseconds
-ok($time_waited >= $two_seconds, "WAIT FOR TIMEOUT waits for enough time");
-
-
-# Check that timeouts let us stop waiting right away, before reaching target LSN
-$node_master->safe_psql('postgres',
-       "INSERT INTO wait_test VALUES (generate_series(11, 20))");
-my $lsn1 = $node_master->safe_psql('postgres', "SELECT pg_current_wal_lsn()");
-my ($ret, $out, $err) = $node_standby->psql('postgres',
-       "BEGIN WAIT FOR LSN '$lsn1' TIMEOUT 1");
-
-ok($ret == 0, "zero return value when failed to WAIT FOR LSN on standby");
-ok($err =~ /WARNING:  didn't start transaction because LSN was not reached/,
-       "correct error message when failed to WAIT FOR LSN on standby");
-ok($out eq "f", "if given too little wait time, WAIT doesn't reach target LSN");
-
-
-# Check that WAIT FOR works fine and reaches target LSN if given no timeout
-
-# Add data on master, memorize master's last LSN
-$node_master->safe_psql('postgres',
-       "INSERT INTO wait_test VALUES (generate_series(21, 30))");
-my $lsn2 = $node_master->safe_psql('postgres', "SELECT pg_current_wal_lsn()");
-
-# Wait for it to appear on replica, memorize replica's last LSN
-$node_standby->safe_psql('postgres',
-       "BEGIN WAIT FOR LSN '$lsn2'");
-my $reached_lsn = $node_standby->safe_psql('postgres',
-       "SELECT pg_last_wal_replay_lsn()");
-
-# Make sure that master's and replica's LSNs are the same after WAIT
-my $compare_lsns = $node_standby->safe_psql('postgres',
-       "SELECT pg_lsn_cmp('$reached_lsn'::pg_lsn, '$lsn2'::pg_lsn)");
-ok($compare_lsns eq 0,
-       "standby reached the same LSN as master before starting transaction");
-
-
-# Make sure that it's not allowed to use WAIT FOR on master
-($ret, $out, $err) = $node_master->psql('postgres',
-       "BEGIN WAIT FOR LSN '0/FFFFFFFF'");
-
-ok($ret != 0, "non-zero return value when trying to WAIT FOR LSN on master");
-ok($err =~ /ERROR:  WAIT FOR can only be used on standby/,
-       "correct error message when trying to WAIT FOR LSN on master");
-ok($out eq '', "empty output when trying to WAIT FOR LSN on master");
-
-
-$node_standby->stop;
-$node_master->stop;
index 020f75c5e20d4db341ea4fff65774fa33ea80cd4..525d58e7f01d0bf14786f52ea6962ec9b4945e2e 100644 (file)
@@ -2621,7 +2621,6 @@ WSABUF
 WSADATA
 WSANETWORKEVENTS
 WSAPROTOCOL_INFO
-WaitClause
 WaitEvent
 WaitEventActivity
 WaitEventClient
@@ -2629,7 +2628,6 @@ WaitEventIO
 WaitEventIPC
 WaitEventSet
 WaitEventTimeout
-WaitLSNState
 WaitPMResult
 WalCloseMethod
 WalLevel