mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 09:32:01 +00:00
Merge branch 'master' into detect-lexer-errors-early
This commit is contained in:
commit
4f799270a1
@ -1088,11 +1088,14 @@ BlockIO InterpreterCreateQuery::createTable(ASTCreateQuery & create)
|
|||||||
String current_database = getContext()->getCurrentDatabase();
|
String current_database = getContext()->getCurrentDatabase();
|
||||||
auto database_name = create.database ? create.getDatabase() : current_database;
|
auto database_name = create.database ? create.getDatabase() : current_database;
|
||||||
|
|
||||||
|
bool is_secondary_query = getContext()->getZooKeeperMetadataTransaction() && !getContext()->getZooKeeperMetadataTransaction()->isInitialQuery();
|
||||||
|
auto mode = getLoadingStrictnessLevel(create.attach, /*force_attach*/ false, /*has_force_restore_data_flag*/ false, is_secondary_query || is_restore_from_backup);
|
||||||
|
|
||||||
if (!create.sql_security && create.supportSQLSecurity() && !getContext()->getServerSettings().ignore_empty_sql_security_in_create_view_query)
|
if (!create.sql_security && create.supportSQLSecurity() && !getContext()->getServerSettings().ignore_empty_sql_security_in_create_view_query)
|
||||||
create.sql_security = std::make_shared<ASTSQLSecurity>();
|
create.sql_security = std::make_shared<ASTSQLSecurity>();
|
||||||
|
|
||||||
if (create.sql_security)
|
if (create.sql_security)
|
||||||
processSQLSecurityOption(getContext(), create.sql_security->as<ASTSQLSecurity &>(), create.attach, create.is_materialized_view);
|
processSQLSecurityOption(getContext(), create.sql_security->as<ASTSQLSecurity &>(), create.is_materialized_view, /* skip_check_permissions= */ mode >= LoadingStrictnessLevel::SECONDARY_CREATE);
|
||||||
|
|
||||||
DDLGuardPtr ddl_guard;
|
DDLGuardPtr ddl_guard;
|
||||||
|
|
||||||
@ -1219,9 +1222,6 @@ BlockIO InterpreterCreateQuery::createTable(ASTCreateQuery & create)
|
|||||||
if (!UserDefinedSQLFunctionFactory::instance().empty())
|
if (!UserDefinedSQLFunctionFactory::instance().empty())
|
||||||
UserDefinedSQLFunctionVisitor::visit(query_ptr);
|
UserDefinedSQLFunctionVisitor::visit(query_ptr);
|
||||||
|
|
||||||
bool is_secondary_query = getContext()->getZooKeeperMetadataTransaction() && !getContext()->getZooKeeperMetadataTransaction()->isInitialQuery();
|
|
||||||
auto mode = getLoadingStrictnessLevel(create.attach, /*force_attach*/ false, /*has_force_restore_data_flag*/ false, is_secondary_query || is_restore_from_backup);
|
|
||||||
|
|
||||||
/// Set and retrieve list of columns, indices and constraints. Set table engine if needed. Rewrite query in canonical way.
|
/// Set and retrieve list of columns, indices and constraints. Set table engine if needed. Rewrite query in canonical way.
|
||||||
TableProperties properties = getTablePropertiesAndNormalizeCreateQuery(create, mode);
|
TableProperties properties = getTablePropertiesAndNormalizeCreateQuery(create, mode);
|
||||||
|
|
||||||
@ -1886,7 +1886,7 @@ void InterpreterCreateQuery::addColumnsDescriptionToCreateQueryIfNecessary(ASTCr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterCreateQuery::processSQLSecurityOption(ContextPtr context_, ASTSQLSecurity & sql_security, bool is_attach, bool is_materialized_view)
|
void InterpreterCreateQuery::processSQLSecurityOption(ContextPtr context_, ASTSQLSecurity & sql_security, bool is_materialized_view, bool skip_check_permissions)
|
||||||
{
|
{
|
||||||
/// If no SQL security is specified, apply default from default_*_view_sql_security setting.
|
/// If no SQL security is specified, apply default from default_*_view_sql_security setting.
|
||||||
if (!sql_security.type)
|
if (!sql_security.type)
|
||||||
@ -1927,7 +1927,7 @@ void InterpreterCreateQuery::processSQLSecurityOption(ContextPtr context_, ASTSQ
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Checks the permissions for the specified definer user.
|
/// Checks the permissions for the specified definer user.
|
||||||
if (sql_security.definer && !sql_security.is_definer_current_user && !is_attach)
|
if (sql_security.definer && !sql_security.is_definer_current_user && !skip_check_permissions)
|
||||||
{
|
{
|
||||||
const auto definer_name = sql_security.definer->toString();
|
const auto definer_name = sql_security.definer->toString();
|
||||||
|
|
||||||
@ -1937,7 +1937,7 @@ void InterpreterCreateQuery::processSQLSecurityOption(ContextPtr context_, ASTSQ
|
|||||||
context_->checkAccess(AccessType::SET_DEFINER, definer_name);
|
context_->checkAccess(AccessType::SET_DEFINER, definer_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sql_security.type == SQLSecurityType::NONE && !is_attach)
|
if (sql_security.type == SQLSecurityType::NONE && !skip_check_permissions)
|
||||||
context_->checkAccess(AccessType::ALLOW_SQL_SECURITY_NONE);
|
context_->checkAccess(AccessType::ALLOW_SQL_SECURITY_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ public:
|
|||||||
void extendQueryLogElemImpl(QueryLogElement & elem, const ASTPtr & ast, ContextPtr) const override;
|
void extendQueryLogElemImpl(QueryLogElement & elem, const ASTPtr & ast, ContextPtr) const override;
|
||||||
|
|
||||||
/// Check access right, validate definer statement and replace `CURRENT USER` with actual name.
|
/// Check access right, validate definer statement and replace `CURRENT USER` with actual name.
|
||||||
static void processSQLSecurityOption(ContextPtr context_, ASTSQLSecurity & sql_security, bool is_attach = false, bool is_materialized_view = false);
|
static void processSQLSecurityOption(ContextPtr context_, ASTSQLSecurity & sql_security, bool is_materialized_view = false, bool skip_check_permissions = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct TableProperties
|
struct TableProperties
|
||||||
|
@ -168,6 +168,32 @@ def test_restore_table(engine):
|
|||||||
assert instance.query("SELECT count(), sum(x) FROM test.table") == "100\t4950\n"
|
assert instance.query("SELECT count(), sum(x) FROM test.table") == "100\t4950\n"
|
||||||
|
|
||||||
|
|
||||||
|
def test_restore_materialized_view_with_definer():
|
||||||
|
instance.query("CREATE DATABASE test")
|
||||||
|
instance.query(
|
||||||
|
"CREATE TABLE test.test_table (s String) ENGINE = MergeTree ORDER BY s"
|
||||||
|
)
|
||||||
|
instance.query("CREATE USER u1")
|
||||||
|
instance.query("GRANT SELECT ON *.* TO u1")
|
||||||
|
instance.query("GRANT INSERT ON *.* TO u1")
|
||||||
|
|
||||||
|
instance.query(
|
||||||
|
"""
|
||||||
|
CREATE MATERIALIZED VIEW test.test_mv_1 (s String)
|
||||||
|
ENGINE = MergeTree ORDER BY s
|
||||||
|
DEFINER = u1 SQL SECURITY DEFINER
|
||||||
|
AS SELECT * FROM test.test_table
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
backup_name = new_backup_name()
|
||||||
|
instance.query(f"BACKUP DATABASE test TO {backup_name}")
|
||||||
|
instance.query("DROP DATABASE test")
|
||||||
|
instance.query("DROP USER u1")
|
||||||
|
|
||||||
|
instance.query(f"RESTORE DATABASE test FROM {backup_name}")
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"engine", ["MergeTree", "Log", "TinyLog", "StripeLog", "Memory"]
|
"engine", ["MergeTree", "Log", "TinyLog", "StripeLog", "Memory"]
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user