This is an automated email from the ASF dual-hosted git repository.
huor pushed a commit to branch taoz
in repository https://gitbox.apache.org/repos/asf/hawq.git
The following commit(s) were added to refs/heads/taoz by this push:
new 8afca8b Enable LOCK TABLE command and add case for it
8afca8b is described below
commit 8afca8b1a7edcdaf88e23667c0d1967a7d86a51b
Author: Ruilong Huo <[email protected]>
AuthorDate: Tue Nov 12 17:11:03 2019 +0800
Enable LOCK TABLE command and add case for it
---
src/backend/tcop/utility.c | 2 +
src/test/feature/lock/TestLock.cpp | 60 +++++++++++++++++
src/test/feature/lock/ans/lock.ans | 129 +++++++++++++++++++++++++++++++++++++
src/test/feature/lock/sql/lock.sql | 71 ++++++++++++++++++++
4 files changed, 262 insertions(+)
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index af2d12c..b3962fe 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -1670,12 +1670,14 @@ ProcessUtility(Node *parsetree,
case T_LockStmt:
/* if guc variable not set, or bootstrap mode, or
utility mode connection, throw exception*/
+ /*
if (!(IsBootstrapProcessingMode() || (Gp_role ==
GP_ROLE_UTILITY)
|| gp_called_by_pgdump))
{
ereport(ERROR,
(errcode(ERRCODE_CDB_FEATURE_NOT_YET), errmsg("Cannot support lock statement
yet") ));
}
+ */
LockTableCommand((LockStmt *) parsetree);
break;
diff --git a/src/test/feature/lock/TestLock.cpp
b/src/test/feature/lock/TestLock.cpp
new file mode 100644
index 0000000..00e1932
--- /dev/null
+++ b/src/test/feature/lock/TestLock.cpp
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gtest/gtest.h"
+
+#include "lib/sql_util.h"
+
+using std::string;
+
+class TestLock: public ::testing::Test
+{
+ public:
+ TestLock() { }
+ ~TestLock() {}
+};
+
+TEST_F(TestLock, LockBasics)
+{
+ hawq::test::SQLUtility util;
+ util.execSQLFile("lock/sql/lock.sql", "lock/ans/lock.ans");
+}
+
+TEST_F(TestLock, DeadLock)
+{
+ hawq::test::SQLUtility util1(hawq::test::MODE_DEFAULT);
+ hawq::test::SQLUtility util2(hawq::test::MODE_DEFAULT);
+ util1.execute("drop table if exists TEST1");
+ util1.execute("drop table if exists TEST2");
+ util1.execute("CREATE TABLE TEST1(A INT)");
+ util1.execute("CREATE TABLE TEST2(A INT)");
+ util1.execute("insert into TEST1 values(1)");
+ util1.execute("insert into TEST2 values(1)");
+ util1.execute("begin");
+ util1.execute("TRUNCATE TEST1");
+ util2.execute("begin");
+ util2.execute("TRUNCATE TEST2");
+ util1.execute("TRUNCATE TEST2");
+ util2.execute("TRUNCATE TEST1");
+ util1.execute("TRUNCATE TEST2");
+ util1.execute("end");
+ util2.execute("end");
+ util1.query("select * from TEST1",0);
+ util1.query("select * from TEST2",0);
+}
+
diff --git a/src/test/feature/lock/ans/lock.ans
b/src/test/feature/lock/ans/lock.ans
new file mode 100644
index 0000000..84ec034
--- /dev/null
+++ b/src/test/feature/lock/ans/lock.ans
@@ -0,0 +1,129 @@
+-- start_ignore
+SET SEARCH_PATH=TestLock_LockBasics;
+SET
+-- end_ignore
+--
+-- Test the LOCK statement
+--
+-- Setup
+CREATE SCHEMA lock_schema1;
+CREATE SCHEMA
+SET search_path = lock_schema1;
+SET
+CREATE TABLE lock_tbl1 (a BIGINT);
+CREATE TABLE
+CREATE VIEW lock_view1 AS SELECT 1;
+CREATE VIEW
+CREATE ROLE regress_rol_lock1;
+psql:/tmp/TestLock_LockBasics.sql:13: NOTICE: resource queue required --
using default resource queue "pg_default"
+CREATE ROLE
+ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1;
+ALTER ROLE
+GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1;
+GRANT
+-- Try all valid lock options; also try omitting the optional TABLE keyword.
+BEGIN TRANSACTION;
+BEGIN
+LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE;
+LOCK TABLE
+LOCK lock_tbl1 IN ROW SHARE MODE;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN SHARE MODE;
+LOCK TABLE
+LOCK lock_tbl1 IN SHARE ROW EXCLUSIVE MODE;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE;
+LOCK TABLE
+ROLLBACK;
+ROLLBACK
+-- Try using NOWAIT along with valid options.
+BEGIN TRANSACTION;
+BEGIN
+LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE NOWAIT;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN ROW SHARE MODE NOWAIT;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE NOWAIT;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE NOWAIT;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT;
+LOCK TABLE
+LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT;
+LOCK TABLE
+LOCK TABLE lock_view1 IN EXCLUSIVE MODE; -- Will fail; can't lock a non-table
+psql:/tmp/TestLock_LockBasics.sql:39: ERROR: "lock_view1" is not a table
+ROLLBACK;
+ROLLBACK
+-- Verify that we can lock a table with inheritance children.
+CREATE TABLE lock_tbl2 (b BIGINT) INHERITS (lock_tbl1);
+psql:/tmp/TestLock_LockBasics.sql:43: NOTICE: Table has parent, setting
distribution columns to match parent table
+CREATE TABLE
+CREATE TABLE lock_tbl3 () INHERITS (lock_tbl2);
+psql:/tmp/TestLock_LockBasics.sql:44: NOTICE: Table has parent, setting
distribution columns to match parent table
+CREATE TABLE
+BEGIN TRANSACTION;
+BEGIN
+LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE;
+psql:/tmp/TestLock_LockBasics.sql:46: ERROR: syntax error at or near "*"
+LINE 1: LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE;
+ ^
+ROLLBACK;
+ROLLBACK
+-- Verify that we can't lock a child table just because we have permission
+-- on the parent, but that we can lock the parent only.
+GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1;
+GRANT
+SET ROLE regress_rol_lock1;
+SET
+BEGIN;
+BEGIN
+LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE;
+psql:/tmp/TestLock_LockBasics.sql:54: ERROR: syntax error at or near "*"
+LINE 1: LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE;
+ ^
+ROLLBACK;
+ROLLBACK
+BEGIN;
+BEGIN
+LOCK TABLE ONLY lock_tbl1;
+psql:/tmp/TestLock_LockBasics.sql:57: ERROR: syntax error at or near "ONLY"
+LINE 1: LOCK TABLE ONLY lock_tbl1;
+ ^
+ROLLBACK;
+ROLLBACK
+RESET ROLE;
+RESET
+--
+-- Clean up
+--
+DROP VIEW lock_view1;
+DROP VIEW
+DROP TABLE lock_tbl3;
+DROP TABLE
+DROP TABLE lock_tbl2;
+DROP TABLE
+DROP TABLE lock_tbl1;
+DROP TABLE
+DROP SCHEMA lock_schema1 CASCADE;
+DROP SCHEMA
+DROP ROLE regress_rol_lock1;
+DROP ROLE
+-- atomic ops tests
+RESET search_path;
+RESET
+SELECT test_atomic_ops();
+psql:/tmp/TestLock_LockBasics.sql:74: ERROR: function test_atomic_ops() does
not exist
+LINE 1: SELECT test_atomic_ops();
+ ^
+HINT: No function matches the given name and argument types. You may need to
add explicit type casts.
diff --git a/src/test/feature/lock/sql/lock.sql
b/src/test/feature/lock/sql/lock.sql
new file mode 100644
index 0000000..567e8bc
--- /dev/null
+++ b/src/test/feature/lock/sql/lock.sql
@@ -0,0 +1,71 @@
+--
+-- Test the LOCK statement
+--
+
+-- Setup
+CREATE SCHEMA lock_schema1;
+SET search_path = lock_schema1;
+CREATE TABLE lock_tbl1 (a BIGINT);
+CREATE VIEW lock_view1 AS SELECT 1;
+CREATE ROLE regress_rol_lock1;
+ALTER ROLE regress_rol_lock1 SET search_path = lock_schema1;
+GRANT USAGE ON SCHEMA lock_schema1 TO regress_rol_lock1;
+
+-- Try all valid lock options; also try omitting the optional TABLE keyword.
+BEGIN TRANSACTION;
+LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE;
+LOCK lock_tbl1 IN ROW SHARE MODE;
+LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE;
+LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE;
+LOCK TABLE lock_tbl1 IN SHARE MODE;
+LOCK lock_tbl1 IN SHARE ROW EXCLUSIVE MODE;
+LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE;
+LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE;
+ROLLBACK;
+
+-- Try using NOWAIT along with valid options.
+BEGIN TRANSACTION;
+LOCK TABLE lock_tbl1 IN ACCESS SHARE MODE NOWAIT;
+LOCK TABLE lock_tbl1 IN ROW SHARE MODE NOWAIT;
+LOCK TABLE lock_tbl1 IN ROW EXCLUSIVE MODE NOWAIT;
+LOCK TABLE lock_tbl1 IN SHARE UPDATE EXCLUSIVE MODE NOWAIT;
+LOCK TABLE lock_tbl1 IN SHARE MODE NOWAIT;
+LOCK TABLE lock_tbl1 IN SHARE ROW EXCLUSIVE MODE NOWAIT;
+LOCK TABLE lock_tbl1 IN EXCLUSIVE MODE NOWAIT;
+LOCK TABLE lock_tbl1 IN ACCESS EXCLUSIVE MODE NOWAIT;
+LOCK TABLE lock_view1 IN EXCLUSIVE MODE; -- Will fail; can't lock a non-table
+ROLLBACK;
+
+-- Verify that we can lock a table with inheritance children.
+CREATE TABLE lock_tbl2 (b BIGINT) INHERITS (lock_tbl1);
+CREATE TABLE lock_tbl3 () INHERITS (lock_tbl2);
+BEGIN TRANSACTION;
+LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE;
+ROLLBACK;
+
+-- Verify that we can't lock a child table just because we have permission
+-- on the parent, but that we can lock the parent only.
+GRANT UPDATE ON TABLE lock_tbl1 TO regress_rol_lock1;
+SET ROLE regress_rol_lock1;
+BEGIN;
+LOCK TABLE lock_tbl1 * IN ACCESS EXCLUSIVE MODE;
+ROLLBACK;
+BEGIN;
+LOCK TABLE ONLY lock_tbl1;
+ROLLBACK;
+RESET ROLE;
+
+--
+-- Clean up
+--
+DROP VIEW lock_view1;
+DROP TABLE lock_tbl3;
+DROP TABLE lock_tbl2;
+DROP TABLE lock_tbl1;
+DROP SCHEMA lock_schema1 CASCADE;
+DROP ROLE regress_rol_lock1;
+
+
+-- atomic ops tests
+RESET search_path;
+SELECT test_atomic_ops();