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();