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 <huoruil...@163.com>
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();

Reply via email to