mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-30 11:32:03 +00:00
Merge branch 'master' into many-fixes-3
This commit is contained in:
commit
6d8434c702
@ -3201,6 +3201,40 @@ ENGINE = Log
|
|||||||
└──────────────────────────────────────────────────────────────────────────┘
|
└──────────────────────────────────────────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## default_temporary_table_engine {#default_temporary_table_engine}
|
||||||
|
|
||||||
|
Same as [default_table_engine](#default_table_engine) but for temporary tables.
|
||||||
|
|
||||||
|
Default value: `Memory`.
|
||||||
|
|
||||||
|
In this example, any new temporary table that does not specify an `Engine` will use the `Log` table engine:
|
||||||
|
|
||||||
|
Query:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SET default_temporary_table_engine = 'Log';
|
||||||
|
|
||||||
|
CREATE TEMPORARY TABLE my_table (
|
||||||
|
x UInt32,
|
||||||
|
y UInt32
|
||||||
|
);
|
||||||
|
|
||||||
|
SHOW CREATE TEMPORARY TABLE my_table;
|
||||||
|
```
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
```response
|
||||||
|
┌─statement────────────────────────────────────────────────────────────────┐
|
||||||
|
│ CREATE TEMPORARY TABLE default.my_table
|
||||||
|
(
|
||||||
|
`x` UInt32,
|
||||||
|
`y` UInt32
|
||||||
|
)
|
||||||
|
ENGINE = Log
|
||||||
|
└──────────────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
## data_type_default_nullable {#data_type_default_nullable}
|
## data_type_default_nullable {#data_type_default_nullable}
|
||||||
|
|
||||||
Allows data types without explicit modifiers [NULL or NOT NULL](../../sql-reference/statements/create/table.md/#null-modifiers) in column definition will be [Nullable](../../sql-reference/data-types/nullable.md/#data_type-nullable).
|
Allows data types without explicit modifiers [NULL or NOT NULL](../../sql-reference/statements/create/table.md/#null-modifiers) in column definition will be [Nullable](../../sql-reference/data-types/nullable.md/#data_type-nullable).
|
||||||
|
@ -155,7 +155,7 @@ namespace
|
|||||||
|
|
||||||
|
|
||||||
AccessRightsElement::AccessRightsElement(AccessFlags access_flags_, std::string_view database_)
|
AccessRightsElement::AccessRightsElement(AccessFlags access_flags_, std::string_view database_)
|
||||||
: access_flags(access_flags_), database(database_), any_database(false)
|
: access_flags(access_flags_), database(database_), parameter(database_), any_database(false), any_parameter(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ enum class AccessType
|
|||||||
M(ALTER_FREEZE_PARTITION, "FREEZE PARTITION, UNFREEZE", TABLE, ALTER_TABLE) \
|
M(ALTER_FREEZE_PARTITION, "FREEZE PARTITION, UNFREEZE", TABLE, ALTER_TABLE) \
|
||||||
\
|
\
|
||||||
M(ALTER_DATABASE_SETTINGS, "ALTER DATABASE SETTING, ALTER MODIFY DATABASE SETTING, MODIFY DATABASE SETTING", DATABASE, ALTER_DATABASE) /* allows to execute ALTER MODIFY SETTING */\
|
M(ALTER_DATABASE_SETTINGS, "ALTER DATABASE SETTING, ALTER MODIFY DATABASE SETTING, MODIFY DATABASE SETTING", DATABASE, ALTER_DATABASE) /* allows to execute ALTER MODIFY SETTING */\
|
||||||
M(ALTER_NAMED_COLLECTION, "", NAMED_COLLECTION, NAMED_COLLECTION_CONTROL) /* allows to execute ALTER NAMED COLLECTION */\
|
M(ALTER_NAMED_COLLECTION, "", NAMED_COLLECTION, NAMED_COLLECTION_ADMIN) /* allows to execute ALTER NAMED COLLECTION */\
|
||||||
\
|
\
|
||||||
M(ALTER_TABLE, "", GROUP, ALTER) \
|
M(ALTER_TABLE, "", GROUP, ALTER) \
|
||||||
M(ALTER_DATABASE, "", GROUP, ALTER) \
|
M(ALTER_DATABASE, "", GROUP, ALTER) \
|
||||||
@ -92,7 +92,7 @@ enum class AccessType
|
|||||||
M(CREATE_ARBITRARY_TEMPORARY_TABLE, "", GLOBAL, CREATE) /* allows to create and manipulate temporary tables
|
M(CREATE_ARBITRARY_TEMPORARY_TABLE, "", GLOBAL, CREATE) /* allows to create and manipulate temporary tables
|
||||||
with arbitrary table engine */\
|
with arbitrary table engine */\
|
||||||
M(CREATE_FUNCTION, "", GLOBAL, CREATE) /* allows to execute CREATE FUNCTION */ \
|
M(CREATE_FUNCTION, "", GLOBAL, CREATE) /* allows to execute CREATE FUNCTION */ \
|
||||||
M(CREATE_NAMED_COLLECTION, "", NAMED_COLLECTION, NAMED_COLLECTION_CONTROL) /* allows to execute CREATE NAMED COLLECTION */ \
|
M(CREATE_NAMED_COLLECTION, "", NAMED_COLLECTION, NAMED_COLLECTION_ADMIN) /* allows to execute CREATE NAMED COLLECTION */ \
|
||||||
M(CREATE, "", GROUP, ALL) /* allows to execute {CREATE|ATTACH} */ \
|
M(CREATE, "", GROUP, ALL) /* allows to execute {CREATE|ATTACH} */ \
|
||||||
\
|
\
|
||||||
M(DROP_DATABASE, "", DATABASE, DROP) /* allows to execute {DROP|DETACH} DATABASE */\
|
M(DROP_DATABASE, "", DATABASE, DROP) /* allows to execute {DROP|DETACH} DATABASE */\
|
||||||
@ -101,7 +101,7 @@ enum class AccessType
|
|||||||
implicitly enabled by the grant DROP_TABLE */\
|
implicitly enabled by the grant DROP_TABLE */\
|
||||||
M(DROP_DICTIONARY, "", DICTIONARY, DROP) /* allows to execute {DROP|DETACH} DICTIONARY */\
|
M(DROP_DICTIONARY, "", DICTIONARY, DROP) /* allows to execute {DROP|DETACH} DICTIONARY */\
|
||||||
M(DROP_FUNCTION, "", GLOBAL, DROP) /* allows to execute DROP FUNCTION */\
|
M(DROP_FUNCTION, "", GLOBAL, DROP) /* allows to execute DROP FUNCTION */\
|
||||||
M(DROP_NAMED_COLLECTION, "", NAMED_COLLECTION, NAMED_COLLECTION_CONTROL) /* allows to execute DROP NAMED COLLECTION */\
|
M(DROP_NAMED_COLLECTION, "", NAMED_COLLECTION, NAMED_COLLECTION_ADMIN) /* allows to execute DROP NAMED COLLECTION */\
|
||||||
M(DROP, "", GROUP, ALL) /* allows to execute {DROP|DETACH} */\
|
M(DROP, "", GROUP, ALL) /* allows to execute {DROP|DETACH} */\
|
||||||
\
|
\
|
||||||
M(UNDROP_TABLE, "", TABLE, ALL) /* allows to execute {UNDROP} TABLE */\
|
M(UNDROP_TABLE, "", TABLE, ALL) /* allows to execute {UNDROP} TABLE */\
|
||||||
@ -140,9 +140,10 @@ enum class AccessType
|
|||||||
M(SHOW_SETTINGS_PROFILES, "SHOW PROFILES, SHOW CREATE SETTINGS PROFILE, SHOW CREATE PROFILE", GLOBAL, SHOW_ACCESS) \
|
M(SHOW_SETTINGS_PROFILES, "SHOW PROFILES, SHOW CREATE SETTINGS PROFILE, SHOW CREATE PROFILE", GLOBAL, SHOW_ACCESS) \
|
||||||
M(SHOW_ACCESS, "", GROUP, ACCESS_MANAGEMENT) \
|
M(SHOW_ACCESS, "", GROUP, ACCESS_MANAGEMENT) \
|
||||||
M(ACCESS_MANAGEMENT, "", GROUP, ALL) \
|
M(ACCESS_MANAGEMENT, "", GROUP, ALL) \
|
||||||
M(SHOW_NAMED_COLLECTIONS, "SHOW NAMED COLLECTIONS", NAMED_COLLECTION, NAMED_COLLECTION_CONTROL) \
|
M(SHOW_NAMED_COLLECTIONS, "SHOW NAMED COLLECTIONS", NAMED_COLLECTION, NAMED_COLLECTION_ADMIN) \
|
||||||
M(SHOW_NAMED_COLLECTIONS_SECRETS, "SHOW NAMED COLLECTIONS SECRETS", NAMED_COLLECTION, NAMED_COLLECTION_CONTROL) \
|
M(SHOW_NAMED_COLLECTIONS_SECRETS, "SHOW NAMED COLLECTIONS SECRETS", NAMED_COLLECTION, NAMED_COLLECTION_ADMIN) \
|
||||||
M(NAMED_COLLECTION_CONTROL, "", NAMED_COLLECTION, ALL) \
|
M(NAMED_COLLECTION, "NAMED COLLECTION USAGE, USE NAMED COLLECTION", NAMED_COLLECTION, NAMED_COLLECTION_ADMIN) \
|
||||||
|
M(NAMED_COLLECTION_ADMIN, "NAMED COLLECTION CONTROL", NAMED_COLLECTION, ALL) \
|
||||||
\
|
\
|
||||||
M(SYSTEM_SHUTDOWN, "SYSTEM KILL, SHUTDOWN", GLOBAL, SYSTEM) \
|
M(SYSTEM_SHUTDOWN, "SYSTEM KILL, SHUTDOWN", GLOBAL, SYSTEM) \
|
||||||
M(SYSTEM_DROP_DNS_CACHE, "SYSTEM DROP DNS, DROP DNS CACHE, DROP DNS", GLOBAL, SYSTEM_DROP_CACHE) \
|
M(SYSTEM_DROP_DNS_CACHE, "SYSTEM DROP DNS, DROP DNS CACHE, DROP DNS", GLOBAL, SYSTEM_DROP_CACHE) \
|
||||||
|
@ -328,7 +328,7 @@ namespace
|
|||||||
|
|
||||||
if (!named_collection_control)
|
if (!named_collection_control)
|
||||||
{
|
{
|
||||||
user->access.revoke(AccessType::NAMED_COLLECTION_CONTROL);
|
user->access.revoke(AccessType::NAMED_COLLECTION_ADMIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!show_named_collections_secrets)
|
if (!show_named_collections_secrets)
|
||||||
|
@ -53,7 +53,7 @@ TEST(AccessRights, Union)
|
|||||||
"SHOW ROW POLICIES, SYSTEM MERGES, SYSTEM TTL MERGES, SYSTEM FETCHES, "
|
"SHOW ROW POLICIES, SYSTEM MERGES, SYSTEM TTL MERGES, SYSTEM FETCHES, "
|
||||||
"SYSTEM MOVES, SYSTEM SENDS, SYSTEM REPLICATION QUEUES, "
|
"SYSTEM MOVES, SYSTEM SENDS, SYSTEM REPLICATION QUEUES, "
|
||||||
"SYSTEM DROP REPLICA, SYSTEM SYNC REPLICA, SYSTEM RESTART REPLICA, "
|
"SYSTEM DROP REPLICA, SYSTEM SYNC REPLICA, SYSTEM RESTART REPLICA, "
|
||||||
"SYSTEM RESTORE REPLICA, SYSTEM WAIT LOADING PARTS, SYSTEM SYNC DATABASE REPLICA, SYSTEM FLUSH DISTRIBUTED, dictGet ON db1.*, GRANT NAMED COLLECTION CONTROL ON db1");
|
"SYSTEM RESTORE REPLICA, SYSTEM WAIT LOADING PARTS, SYSTEM SYNC DATABASE REPLICA, SYSTEM FLUSH DISTRIBUTED, dictGet ON db1.*, GRANT NAMED COLLECTION ADMIN ON db1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -517,6 +517,7 @@ class IColumn;
|
|||||||
M(Seconds, wait_for_window_view_fire_signal_timeout, 10, "Timeout for waiting for window view fire signal in event time processing", 0) \
|
M(Seconds, wait_for_window_view_fire_signal_timeout, 10, "Timeout for waiting for window view fire signal in event time processing", 0) \
|
||||||
M(UInt64, min_free_disk_space_for_temporary_data, 0, "The minimum disk space to keep while writing temporary data used in external sorting and aggregation.", 0) \
|
M(UInt64, min_free_disk_space_for_temporary_data, 0, "The minimum disk space to keep while writing temporary data used in external sorting and aggregation.", 0) \
|
||||||
\
|
\
|
||||||
|
M(DefaultTableEngine, default_temporary_table_engine, DefaultTableEngine::Memory, "Default table engine used when ENGINE is not set in CREATE TEMPORARY statement.",0) \
|
||||||
M(DefaultTableEngine, default_table_engine, DefaultTableEngine::None, "Default table engine used when ENGINE is not set in CREATE statement.",0) \
|
M(DefaultTableEngine, default_table_engine, DefaultTableEngine::None, "Default table engine used when ENGINE is not set in CREATE statement.",0) \
|
||||||
M(Bool, show_table_uuid_in_table_create_query_if_not_nil, false, "For tables in databases with Engine=Atomic show UUID of the table in its CREATE query.", 0) \
|
M(Bool, show_table_uuid_in_table_create_query_if_not_nil, false, "For tables in databases with Engine=Atomic show UUID of the table in its CREATE query.", 0) \
|
||||||
M(Bool, database_atomic_wait_for_drop_and_detach_synchronously, false, "When executing DROP or DETACH TABLE in Atomic database, wait for table data to be finally dropped or detached.", 0) \
|
M(Bool, database_atomic_wait_for_drop_and_detach_synchronously, false, "When executing DROP or DETACH TABLE in Atomic database, wait for table data to be finally dropped or detached.", 0) \
|
||||||
|
@ -217,7 +217,7 @@ void registerDictionarySourceClickHouse(DictionarySourceFactory & factory)
|
|||||||
std::optional<Configuration> configuration;
|
std::optional<Configuration> configuration;
|
||||||
|
|
||||||
std::string settings_config_prefix = config_prefix + ".clickhouse";
|
std::string settings_config_prefix = config_prefix + ".clickhouse";
|
||||||
auto named_collection = created_from_ddl ? tryGetNamedCollectionWithOverrides(config, settings_config_prefix) : nullptr;
|
auto named_collection = created_from_ddl ? tryGetNamedCollectionWithOverrides(config, settings_config_prefix, global_context) : nullptr;
|
||||||
|
|
||||||
if (named_collection)
|
if (named_collection)
|
||||||
{
|
{
|
||||||
|
@ -71,7 +71,7 @@ void registerDictionarySourceMysql(DictionarySourceFactory & factory)
|
|||||||
MySQLSettings mysql_settings;
|
MySQLSettings mysql_settings;
|
||||||
|
|
||||||
std::optional<MySQLDictionarySource::Configuration> dictionary_configuration;
|
std::optional<MySQLDictionarySource::Configuration> dictionary_configuration;
|
||||||
auto named_collection = created_from_ddl ? tryGetNamedCollectionWithOverrides(config, settings_config_prefix) : nullptr;
|
auto named_collection = created_from_ddl ? tryGetNamedCollectionWithOverrides(config, settings_config_prefix, global_context) : nullptr;
|
||||||
if (named_collection)
|
if (named_collection)
|
||||||
{
|
{
|
||||||
auto allowed_arguments{dictionary_allowed_keys};
|
auto allowed_arguments{dictionary_allowed_keys};
|
||||||
|
@ -11,16 +11,7 @@
|
|||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
///
|
|
||||||
/// -------- Column --------- Type ------
|
|
||||||
/// | event_date | DateTime |
|
|
||||||
/// | event_time | UInt64 |
|
|
||||||
/// | query_id | String |
|
|
||||||
/// | remote_file_path | String |
|
|
||||||
/// | segment_range | Tuple |
|
|
||||||
/// | read_type | String |
|
|
||||||
/// -------------------------------------
|
|
||||||
///
|
|
||||||
struct FilesystemCacheLogElement
|
struct FilesystemCacheLogElement
|
||||||
{
|
{
|
||||||
enum class CacheType
|
enum class CacheType
|
||||||
|
@ -881,46 +881,24 @@ void InterpreterCreateQuery::validateTableStructure(const ASTCreateQuery & creat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String InterpreterCreateQuery::getTableEngineName(DefaultTableEngine default_table_engine)
|
namespace
|
||||||
{
|
{
|
||||||
switch (default_table_engine)
|
void checkTemporaryTableEngineName(const String& name)
|
||||||
{
|
{
|
||||||
case DefaultTableEngine::Log:
|
if (name.starts_with("Replicated") || name == "KeeperMap")
|
||||||
return "Log";
|
throw Exception(ErrorCodes::INCORRECT_QUERY, "Temporary tables cannot be created with Replicated or KeeperMap table engines");
|
||||||
|
|
||||||
case DefaultTableEngine::StripeLog:
|
|
||||||
return "StripeLog";
|
|
||||||
|
|
||||||
case DefaultTableEngine::MergeTree:
|
|
||||||
return "MergeTree";
|
|
||||||
|
|
||||||
case DefaultTableEngine::ReplacingMergeTree:
|
|
||||||
return "ReplacingMergeTree";
|
|
||||||
|
|
||||||
case DefaultTableEngine::ReplicatedMergeTree:
|
|
||||||
return "ReplicatedMergeTree";
|
|
||||||
|
|
||||||
case DefaultTableEngine::ReplicatedReplacingMergeTree:
|
|
||||||
return "ReplicatedReplacingMergeTree";
|
|
||||||
|
|
||||||
case DefaultTableEngine::Memory:
|
|
||||||
return "Memory";
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "default_table_engine is set to unknown value");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void InterpreterCreateQuery::setDefaultTableEngine(ASTStorage & storage, ContextPtr local_context)
|
void setDefaultTableEngine(ASTStorage &storage, DefaultTableEngine engine)
|
||||||
{
|
{
|
||||||
if (local_context->getSettingsRef().default_table_engine.value == DefaultTableEngine::None)
|
if (engine == DefaultTableEngine::None)
|
||||||
throw Exception(ErrorCodes::ENGINE_REQUIRED, "Table engine is not specified in CREATE query");
|
throw Exception(ErrorCodes::ENGINE_REQUIRED, "Table engine is not specified in CREATE query");
|
||||||
|
|
||||||
auto engine_ast = std::make_shared<ASTFunction>();
|
auto engine_ast = std::make_shared<ASTFunction>();
|
||||||
auto default_table_engine = local_context->getSettingsRef().default_table_engine.value;
|
engine_ast->name = SettingFieldDefaultTableEngine(engine).toString();
|
||||||
engine_ast->name = getTableEngineName(default_table_engine);
|
engine_ast->no_empty_args = true;
|
||||||
engine_ast->no_empty_args = true;
|
storage.set(storage.engine, engine_ast);
|
||||||
storage.set(storage.engine, engine_ast);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterCreateQuery::setEngine(ASTCreateQuery & create) const
|
void InterpreterCreateQuery::setEngine(ASTCreateQuery & create) const
|
||||||
@ -936,32 +914,23 @@ void InterpreterCreateQuery::setEngine(ASTCreateQuery & create) const
|
|||||||
|
|
||||||
if (create.temporary)
|
if (create.temporary)
|
||||||
{
|
{
|
||||||
/// It's possible if some part of storage definition (such as PARTITION BY) is specified, but ENGINE is not.
|
/// Some part of storage definition is specified, but ENGINE is not: just set the one from default_temporary_table_engine setting.
|
||||||
/// It makes sense when default_table_engine setting is used, but not for temporary tables.
|
|
||||||
/// For temporary tables we ignore this setting to allow CREATE TEMPORARY TABLE query without specifying ENGINE
|
|
||||||
|
|
||||||
if (!create.cluster.empty())
|
if (!create.cluster.empty())
|
||||||
throw Exception(ErrorCodes::INCORRECT_QUERY, "Temporary tables cannot be created with ON CLUSTER clause");
|
throw Exception(ErrorCodes::INCORRECT_QUERY, "Temporary tables cannot be created with ON CLUSTER clause");
|
||||||
|
|
||||||
if (create.storage)
|
if (!create.storage)
|
||||||
{
|
{
|
||||||
if (create.storage->engine)
|
|
||||||
{
|
|
||||||
if (create.storage->engine->name.starts_with("Replicated") || create.storage->engine->name == "KeeperMap")
|
|
||||||
throw Exception(ErrorCodes::INCORRECT_QUERY, "Temporary tables cannot be created with Replicated or KeeperMap table engines");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw Exception(ErrorCodes::INCORRECT_QUERY, "Invalid storage definition for temporary table");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
auto engine_ast = std::make_shared<ASTFunction>();
|
|
||||||
engine_ast->name = "Memory";
|
|
||||||
engine_ast->no_empty_args = true;
|
|
||||||
auto storage_ast = std::make_shared<ASTStorage>();
|
auto storage_ast = std::make_shared<ASTStorage>();
|
||||||
storage_ast->set(storage_ast->engine, engine_ast);
|
|
||||||
create.set(create.storage, storage_ast);
|
create.set(create.storage, storage_ast);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!create.storage->engine)
|
||||||
|
{
|
||||||
|
setDefaultTableEngine(*create.storage, getContext()->getSettingsRef().default_temporary_table_engine.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
checkTemporaryTableEngineName(create.storage->engine->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -969,7 +938,7 @@ void InterpreterCreateQuery::setEngine(ASTCreateQuery & create) const
|
|||||||
{
|
{
|
||||||
/// Some part of storage definition (such as PARTITION BY) is specified, but ENGINE is not: just set default one.
|
/// Some part of storage definition (such as PARTITION BY) is specified, but ENGINE is not: just set default one.
|
||||||
if (!create.storage->engine)
|
if (!create.storage->engine)
|
||||||
setDefaultTableEngine(*create.storage, getContext());
|
setDefaultTableEngine(*create.storage, getContext()->getSettingsRef().default_table_engine.value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1008,7 +977,7 @@ void InterpreterCreateQuery::setEngine(ASTCreateQuery & create) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
create.set(create.storage, std::make_shared<ASTStorage>());
|
create.set(create.storage, std::make_shared<ASTStorage>());
|
||||||
setDefaultTableEngine(*create.storage, getContext());
|
setDefaultTableEngine(*create.storage, getContext()->getSettingsRef().default_table_engine.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void generateUUIDForTable(ASTCreateQuery & create)
|
static void generateUUIDForTable(ASTCreateQuery & create)
|
||||||
|
@ -90,8 +90,6 @@ private:
|
|||||||
/// Calculate list of columns, constraints, indices, etc... of table. Rewrite query in canonical way.
|
/// Calculate list of columns, constraints, indices, etc... of table. Rewrite query in canonical way.
|
||||||
TableProperties getTablePropertiesAndNormalizeCreateQuery(ASTCreateQuery & create) const;
|
TableProperties getTablePropertiesAndNormalizeCreateQuery(ASTCreateQuery & create) const;
|
||||||
void validateTableStructure(const ASTCreateQuery & create, const TableProperties & properties) const;
|
void validateTableStructure(const ASTCreateQuery & create, const TableProperties & properties) const;
|
||||||
static String getTableEngineName(DefaultTableEngine default_table_engine);
|
|
||||||
static void setDefaultTableEngine(ASTStorage & storage, ContextPtr local_context);
|
|
||||||
void setEngine(ASTCreateQuery & create) const;
|
void setEngine(ASTCreateQuery & create) const;
|
||||||
AccessRightsElements getRequiredAccess() const;
|
AccessRightsElements getRequiredAccess() const;
|
||||||
|
|
||||||
|
@ -370,15 +370,15 @@ BlockIO InterpreterSystemQuery::execute()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto cache = FileCacheFactory::instance().getByName(query.filesystem_cache_name).cache;
|
auto cache = FileCacheFactory::instance().getByName(query.filesystem_cache_name).cache;
|
||||||
if (query.delete_key.empty())
|
if (query.key_to_drop.empty())
|
||||||
{
|
{
|
||||||
cache->removeAllReleasable();
|
cache->removeAllReleasable();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto key = FileCacheKey::fromKeyString(query.delete_key);
|
auto key = FileCacheKey::fromKeyString(query.key_to_drop);
|
||||||
if (query.delete_offset.has_value())
|
if (query.offset_to_drop.has_value())
|
||||||
cache->removeFileSegment(key, query.delete_offset.value());
|
cache->removeFileSegment(key, query.offset_to_drop.value());
|
||||||
else
|
else
|
||||||
cache->removeKey(key);
|
cache->removeKey(key);
|
||||||
}
|
}
|
||||||
|
@ -212,11 +212,11 @@ void ASTSystemQuery::formatImpl(const FormatSettings & settings, FormatState &,
|
|||||||
if (!filesystem_cache_name.empty())
|
if (!filesystem_cache_name.empty())
|
||||||
{
|
{
|
||||||
settings.ostr << (settings.hilite ? hilite_none : "") << " " << filesystem_cache_name;
|
settings.ostr << (settings.hilite ? hilite_none : "") << " " << filesystem_cache_name;
|
||||||
if (!delete_key.empty())
|
if (!key_to_drop.empty())
|
||||||
{
|
{
|
||||||
settings.ostr << (settings.hilite ? hilite_none : "") << " KEY " << delete_key;
|
settings.ostr << (settings.hilite ? hilite_none : "") << " KEY " << key_to_drop;
|
||||||
if (delete_offset.has_value())
|
if (offset_to_drop.has_value())
|
||||||
settings.ostr << (settings.hilite ? hilite_none : "") << " OFFSET " << delete_offset.value();
|
settings.ostr << (settings.hilite ? hilite_none : "") << " OFFSET " << offset_to_drop.value();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,8 +107,8 @@ public:
|
|||||||
UInt64 seconds{};
|
UInt64 seconds{};
|
||||||
|
|
||||||
String filesystem_cache_name;
|
String filesystem_cache_name;
|
||||||
std::string delete_key;
|
std::string key_to_drop;
|
||||||
std::optional<size_t> delete_offset;
|
std::optional<size_t> offset_to_drop;
|
||||||
|
|
||||||
String backup_name;
|
String backup_name;
|
||||||
|
|
||||||
|
@ -409,9 +409,9 @@ bool ParserSystemQuery::parseImpl(IParser::Pos & pos, ASTPtr & node, Expected &
|
|||||||
res->filesystem_cache_name = ast->as<ASTLiteral>()->value.safeGet<String>();
|
res->filesystem_cache_name = ast->as<ASTLiteral>()->value.safeGet<String>();
|
||||||
if (ParserKeyword{"KEY"}.ignore(pos, expected) && ParserIdentifier().parse(pos, ast, expected))
|
if (ParserKeyword{"KEY"}.ignore(pos, expected) && ParserIdentifier().parse(pos, ast, expected))
|
||||||
{
|
{
|
||||||
res->delete_key = ast->as<ASTIdentifier>()->name();
|
res->key_to_drop = ast->as<ASTIdentifier>()->name();
|
||||||
if (ParserKeyword{"OFFSET"}.ignore(pos, expected) && ParserLiteral().parse(pos, ast, expected))
|
if (ParserKeyword{"OFFSET"}.ignore(pos, expected) && ParserLiteral().parse(pos, ast, expected))
|
||||||
res->delete_offset = ast->as<ASTLiteral>()->value.safeGet<UInt64>();
|
res->offset_to_drop = ast->as<ASTLiteral>()->value.safeGet<UInt64>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!parseQueryWithOnCluster(res, pos, expected))
|
if (!parseQueryWithOnCluster(res, pos, expected))
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "NamedCollectionsHelpers.h"
|
#include "NamedCollectionsHelpers.h"
|
||||||
|
#include <Access/ContextAccess.h>
|
||||||
#include <Common/NamedCollections/NamedCollections.h>
|
#include <Common/NamedCollections/NamedCollections.h>
|
||||||
#include <Interpreters/evaluateConstantExpression.h>
|
#include <Interpreters/evaluateConstantExpression.h>
|
||||||
#include <Storages/checkAndGetLiteralArgument.h>
|
#include <Storages/checkAndGetLiteralArgument.h>
|
||||||
@ -15,19 +16,16 @@ namespace ErrorCodes
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
NamedCollectionPtr tryGetNamedCollectionFromASTs(ASTs asts, bool throw_unknown_collection)
|
std::optional<std::string> getCollectionName(ASTs asts)
|
||||||
{
|
{
|
||||||
if (asts.empty())
|
if (asts.empty())
|
||||||
return nullptr;
|
return std::nullopt;
|
||||||
|
|
||||||
const auto * identifier = asts[0]->as<ASTIdentifier>();
|
const auto * identifier = asts[0]->as<ASTIdentifier>();
|
||||||
if (!identifier)
|
if (!identifier)
|
||||||
return nullptr;
|
return std::nullopt;
|
||||||
|
|
||||||
const auto & collection_name = identifier->name();
|
return identifier->name();
|
||||||
if (throw_unknown_collection)
|
|
||||||
return NamedCollectionFactory::instance().get(collection_name);
|
|
||||||
return NamedCollectionFactory::instance().tryGet(collection_name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::pair<std::string, std::variant<Field, ASTPtr>>> getKeyValueFromAST(ASTPtr ast, bool fallback_to_ast_value, ContextPtr context)
|
std::optional<std::pair<std::string, std::variant<Field, ASTPtr>>> getKeyValueFromAST(ASTPtr ast, bool fallback_to_ast_value, ContextPtr context)
|
||||||
@ -74,7 +72,18 @@ MutableNamedCollectionPtr tryGetNamedCollectionWithOverrides(
|
|||||||
|
|
||||||
NamedCollectionUtils::loadIfNot();
|
NamedCollectionUtils::loadIfNot();
|
||||||
|
|
||||||
auto collection = tryGetNamedCollectionFromASTs(asts, throw_unknown_collection);
|
auto collection_name = getCollectionName(asts);
|
||||||
|
if (!collection_name.has_value())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
context->checkAccess(AccessType::NAMED_COLLECTION, *collection_name);
|
||||||
|
|
||||||
|
NamedCollectionPtr collection;
|
||||||
|
if (throw_unknown_collection)
|
||||||
|
collection = NamedCollectionFactory::instance().get(*collection_name);
|
||||||
|
else
|
||||||
|
collection = NamedCollectionFactory::instance().tryGet(*collection_name);
|
||||||
|
|
||||||
if (!collection)
|
if (!collection)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
@ -106,12 +115,14 @@ MutableNamedCollectionPtr tryGetNamedCollectionWithOverrides(
|
|||||||
}
|
}
|
||||||
|
|
||||||
MutableNamedCollectionPtr tryGetNamedCollectionWithOverrides(
|
MutableNamedCollectionPtr tryGetNamedCollectionWithOverrides(
|
||||||
const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix)
|
const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, ContextPtr context)
|
||||||
{
|
{
|
||||||
auto collection_name = config.getString(config_prefix + ".name", "");
|
auto collection_name = config.getString(config_prefix + ".name", "");
|
||||||
if (collection_name.empty())
|
if (collection_name.empty())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
context->checkAccess(AccessType::NAMED_COLLECTION, collection_name);
|
||||||
|
|
||||||
const auto & collection = NamedCollectionFactory::instance().get(collection_name);
|
const auto & collection = NamedCollectionFactory::instance().get(collection_name);
|
||||||
auto collection_copy = collection->duplicate();
|
auto collection_copy = collection->duplicate();
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ MutableNamedCollectionPtr tryGetNamedCollectionWithOverrides(
|
|||||||
ASTs asts, ContextPtr context, bool throw_unknown_collection = true, std::vector<std::pair<std::string, ASTPtr>> * complex_args = nullptr);
|
ASTs asts, ContextPtr context, bool throw_unknown_collection = true, std::vector<std::pair<std::string, ASTPtr>> * complex_args = nullptr);
|
||||||
/// Helper function to get named collection for dictionary source.
|
/// Helper function to get named collection for dictionary source.
|
||||||
/// Dictionaries have collection name as name argument of dict configuration and other arguments are overrides.
|
/// Dictionaries have collection name as name argument of dict configuration and other arguments are overrides.
|
||||||
MutableNamedCollectionPtr tryGetNamedCollectionWithOverrides(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix);
|
MutableNamedCollectionPtr tryGetNamedCollectionWithOverrides(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, ContextPtr context);
|
||||||
|
|
||||||
HTTPHeaderEntries getHeadersFromNamedCollection(const NamedCollection & collection);
|
HTTPHeaderEntries getHeadersFromNamedCollection(const NamedCollection & collection);
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
</networks>
|
</networks>
|
||||||
<profile>default</profile>
|
<profile>default</profile>
|
||||||
<quota>default</quota>
|
<quota>default</quota>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
</default>
|
</default>
|
||||||
</users>
|
</users>
|
||||||
|
|
||||||
|
@ -8,9 +8,14 @@ import logging
|
|||||||
|
|
||||||
DICTS = ["configs/dictionaries/mysql_dict1.xml", "configs/dictionaries/mysql_dict2.xml"]
|
DICTS = ["configs/dictionaries/mysql_dict1.xml", "configs/dictionaries/mysql_dict2.xml"]
|
||||||
CONFIG_FILES = ["configs/remote_servers.xml", "configs/named_collections.xml"]
|
CONFIG_FILES = ["configs/remote_servers.xml", "configs/named_collections.xml"]
|
||||||
|
USER_CONFIGS = ["configs/users.xml"]
|
||||||
cluster = ClickHouseCluster(__file__)
|
cluster = ClickHouseCluster(__file__)
|
||||||
instance = cluster.add_instance(
|
instance = cluster.add_instance(
|
||||||
"instance", main_configs=CONFIG_FILES, with_mysql=True, dictionaries=DICTS
|
"instance",
|
||||||
|
main_configs=CONFIG_FILES,
|
||||||
|
user_configs=USER_CONFIGS,
|
||||||
|
with_mysql=True,
|
||||||
|
dictionaries=DICTS,
|
||||||
)
|
)
|
||||||
|
|
||||||
create_table_mysql_template = """
|
create_table_mysql_template = """
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<quota>default</quota>
|
||||||
|
<use_named_collections>1</use_named_collections>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -9,6 +9,7 @@ node = cluster.add_instance(
|
|||||||
main_configs=[
|
main_configs=[
|
||||||
"configs/named_collections.xml",
|
"configs/named_collections.xml",
|
||||||
],
|
],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
with_zookeeper=True,
|
with_zookeeper=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<quota>default</quota>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -12,6 +12,7 @@ cluster = ClickHouseCluster(__file__)
|
|||||||
clickhouse_node = cluster.add_instance(
|
clickhouse_node = cluster.add_instance(
|
||||||
"node1",
|
"node1",
|
||||||
main_configs=["configs/remote_servers.xml", "configs/named_collections.xml"],
|
main_configs=["configs/remote_servers.xml", "configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
with_mysql=True,
|
with_mysql=True,
|
||||||
stay_alive=True,
|
stay_alive=True,
|
||||||
)
|
)
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<quota>default</quota>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -8,7 +8,10 @@ from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
|
|||||||
|
|
||||||
cluster = ClickHouseCluster(__file__)
|
cluster = ClickHouseCluster(__file__)
|
||||||
node1 = cluster.add_instance(
|
node1 = cluster.add_instance(
|
||||||
"node1", main_configs=["configs/named_collections.xml"], with_postgres=True
|
"node1",
|
||||||
|
main_configs=["configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
|
with_postgres=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
postgres_table_template = """
|
postgres_table_template = """
|
||||||
|
@ -4,4 +4,11 @@
|
|||||||
<allow_experimental_database_materialized_postgresql>1</allow_experimental_database_materialized_postgresql>
|
<allow_experimental_database_materialized_postgresql>1</allow_experimental_database_materialized_postgresql>
|
||||||
</default>
|
</default>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
</clickhouse>
|
</clickhouse>
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -9,6 +9,7 @@ cluster = ClickHouseCluster(__file__)
|
|||||||
node1 = cluster.add_instance(
|
node1 = cluster.add_instance(
|
||||||
"node1",
|
"node1",
|
||||||
main_configs=["configs/named_collections.xml"],
|
main_configs=["configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
with_zookeeper=False,
|
with_zookeeper=False,
|
||||||
with_hdfs=True,
|
with_hdfs=True,
|
||||||
)
|
)
|
||||||
|
9
tests/integration/test_s3_cluster/configs/users.xml
Normal file
9
tests/integration/test_s3_cluster/configs/users.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -68,6 +68,7 @@ def started_cluster():
|
|||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"s0_0_0",
|
"s0_0_0",
|
||||||
main_configs=["configs/cluster.xml", "configs/named_collections.xml"],
|
main_configs=["configs/cluster.xml", "configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
macros={"replica": "node1", "shard": "shard1"},
|
macros={"replica": "node1", "shard": "shard1"},
|
||||||
with_minio=True,
|
with_minio=True,
|
||||||
with_zookeeper=True,
|
with_zookeeper=True,
|
||||||
@ -75,12 +76,14 @@ def started_cluster():
|
|||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"s0_0_1",
|
"s0_0_1",
|
||||||
main_configs=["configs/cluster.xml", "configs/named_collections.xml"],
|
main_configs=["configs/cluster.xml", "configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
macros={"replica": "replica2", "shard": "shard1"},
|
macros={"replica": "replica2", "shard": "shard1"},
|
||||||
with_zookeeper=True,
|
with_zookeeper=True,
|
||||||
)
|
)
|
||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"s0_1_0",
|
"s0_1_0",
|
||||||
main_configs=["configs/cluster.xml", "configs/named_collections.xml"],
|
main_configs=["configs/cluster.xml", "configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
macros={"replica": "replica1", "shard": "shard2"},
|
macros={"replica": "replica1", "shard": "shard2"},
|
||||||
with_zookeeper=True,
|
with_zookeeper=True,
|
||||||
)
|
)
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -11,6 +11,9 @@ node = cluster.add_instance(
|
|||||||
main_configs=[
|
main_configs=[
|
||||||
"configs/config.d/minio.xml",
|
"configs/config.d/minio.xml",
|
||||||
],
|
],
|
||||||
|
user_configs=[
|
||||||
|
"configs/users.d/users.xml",
|
||||||
|
],
|
||||||
with_minio=True,
|
with_minio=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -25,7 +25,7 @@ def cluster():
|
|||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"node",
|
"node",
|
||||||
main_configs=["configs/named_collections.xml"],
|
main_configs=["configs/named_collections.xml"],
|
||||||
user_configs=["configs/disable_profilers.xml"],
|
user_configs=["configs/disable_profilers.xml", "configs/users.xml"],
|
||||||
with_azurite=True,
|
with_azurite=True,
|
||||||
)
|
)
|
||||||
cluster.start()
|
cluster.start()
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -53,6 +53,7 @@ def started_cluster():
|
|||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"node1",
|
"node1",
|
||||||
main_configs=["configs/config.d/named_collections.xml"],
|
main_configs=["configs/config.d/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.d/users.xml"],
|
||||||
with_minio=True,
|
with_minio=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
9
tests/integration/test_storage_dict/configs/users.xml
Normal file
9
tests/integration/test_storage_dict/configs/users.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -10,7 +10,10 @@ def cluster():
|
|||||||
try:
|
try:
|
||||||
cluster = ClickHouseCluster(__file__)
|
cluster = ClickHouseCluster(__file__)
|
||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"node1", main_configs=["configs/conf.xml"], with_nginx=True
|
"node1",
|
||||||
|
main_configs=["configs/conf.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
|
with_nginx=True,
|
||||||
)
|
)
|
||||||
cluster.start()
|
cluster.start()
|
||||||
|
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -51,6 +51,7 @@ def started_cluster():
|
|||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"node1",
|
"node1",
|
||||||
main_configs=["configs/config.d/named_collections.xml"],
|
main_configs=["configs/config.d/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.d/users.xml"],
|
||||||
with_minio=True,
|
with_minio=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -53,6 +53,7 @@ def started_cluster():
|
|||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"node1",
|
"node1",
|
||||||
main_configs=["configs/config.d/named_collections.xml"],
|
main_configs=["configs/config.d/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.d/users.xml"],
|
||||||
with_minio=True,
|
with_minio=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -6,4 +6,11 @@
|
|||||||
<insert_keeper_max_retries>0</insert_keeper_max_retries>
|
<insert_keeper_max_retries>0</insert_keeper_max_retries>
|
||||||
</default>
|
</default>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
</clickhouse>
|
</clickhouse>
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -16,7 +16,10 @@ def started_cluster(request):
|
|||||||
try:
|
try:
|
||||||
cluster = ClickHouseCluster(__file__)
|
cluster = ClickHouseCluster(__file__)
|
||||||
node = cluster.add_instance(
|
node = cluster.add_instance(
|
||||||
"meili", main_configs=["configs/named_collection.xml"], with_meili=True
|
"meili",
|
||||||
|
main_configs=["configs/named_collection.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
|
with_meili=True,
|
||||||
)
|
)
|
||||||
cluster.start()
|
cluster.start()
|
||||||
yield cluster
|
yield cluster
|
||||||
|
9
tests/integration/test_storage_mongodb/configs/users.xml
Normal file
9
tests/integration/test_storage_mongodb/configs/users.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -17,6 +17,7 @@ def started_cluster(request):
|
|||||||
"configs_secure/config.d/ssl_conf.xml",
|
"configs_secure/config.d/ssl_conf.xml",
|
||||||
"configs/named_collections.xml",
|
"configs/named_collections.xml",
|
||||||
],
|
],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
with_mongo=True,
|
with_mongo=True,
|
||||||
with_mongo_secure=request.param,
|
with_mongo_secure=request.param,
|
||||||
)
|
)
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
<ip>::/0</ip>
|
<ip>::/0</ip>
|
||||||
</networks>
|
</networks>
|
||||||
<profile>default</profile>
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
</default>
|
</default>
|
||||||
</users>
|
</users>
|
||||||
</clickhouse>
|
</clickhouse>
|
||||||
|
@ -13,6 +13,7 @@ cluster = ClickHouseCluster(__file__)
|
|||||||
node1 = cluster.add_instance(
|
node1 = cluster.add_instance(
|
||||||
"node1",
|
"node1",
|
||||||
main_configs=["configs/remote_servers.xml", "configs/named_collections.xml"],
|
main_configs=["configs/remote_servers.xml", "configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
with_mysql=True,
|
with_mysql=True,
|
||||||
)
|
)
|
||||||
node2 = cluster.add_instance(
|
node2 = cluster.add_instance(
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -7,12 +7,15 @@ from helpers.postgres_utility import get_postgres_conn
|
|||||||
|
|
||||||
cluster = ClickHouseCluster(__file__)
|
cluster = ClickHouseCluster(__file__)
|
||||||
node1 = cluster.add_instance(
|
node1 = cluster.add_instance(
|
||||||
"node1", main_configs=["configs/named_collections.xml"], with_postgres=True
|
"node1",
|
||||||
|
main_configs=["configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
|
with_postgres=True,
|
||||||
)
|
)
|
||||||
node2 = cluster.add_instance(
|
node2 = cluster.add_instance(
|
||||||
"node2",
|
"node2",
|
||||||
main_configs=["configs/named_collections.xml"],
|
main_configs=["configs/named_collections.xml"],
|
||||||
user_configs=["configs/settings.xml"],
|
user_configs=["configs/settings.xml", "configs/users.xml"],
|
||||||
with_postgres_cluster=True,
|
with_postgres_cluster=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -4,4 +4,11 @@
|
|||||||
<stream_like_engine_allow_direct_select>1</stream_like_engine_allow_direct_select>
|
<stream_like_engine_allow_direct_select>1</stream_like_engine_allow_direct_select>
|
||||||
</default>
|
</default>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
</clickhouse>
|
</clickhouse>
|
||||||
|
19
tests/integration/test_storage_s3/configs/access.xml
Normal file
19
tests/integration/test_storage_s3/configs/access.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<admin>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<quota>default</quota>
|
||||||
|
<grants>
|
||||||
|
<query>GRANT admin_role</query>
|
||||||
|
</grants>
|
||||||
|
</admin>
|
||||||
|
</users>
|
||||||
|
<roles>
|
||||||
|
<admin_role>
|
||||||
|
<grants>
|
||||||
|
<query>GRANT USE NAMED COLLECTION ON * WITH GRANT OPTION</query>
|
||||||
|
</grants>
|
||||||
|
</admin_role>
|
||||||
|
</roles>
|
||||||
|
</clickhouse>
|
9
tests/integration/test_storage_s3/configs/users.xml
Normal file
9
tests/integration/test_storage_s3/configs/users.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -55,6 +55,17 @@ def started_cluster():
|
|||||||
"configs/named_collections.xml",
|
"configs/named_collections.xml",
|
||||||
"configs/schema_cache.xml",
|
"configs/schema_cache.xml",
|
||||||
],
|
],
|
||||||
|
user_configs=["configs/access.xml", "configs/users.xml"],
|
||||||
|
)
|
||||||
|
cluster.add_instance(
|
||||||
|
"dummy_without_named_collections",
|
||||||
|
with_minio=True,
|
||||||
|
main_configs=[
|
||||||
|
"configs/defaultS3.xml",
|
||||||
|
"configs/named_collections.xml",
|
||||||
|
"configs/schema_cache.xml",
|
||||||
|
],
|
||||||
|
user_configs=["configs/access.xml"],
|
||||||
)
|
)
|
||||||
cluster.add_instance(
|
cluster.add_instance(
|
||||||
"s3_max_redirects",
|
"s3_max_redirects",
|
||||||
@ -918,25 +929,61 @@ def test_truncate_table(started_cluster):
|
|||||||
|
|
||||||
def test_predefined_connection_configuration(started_cluster):
|
def test_predefined_connection_configuration(started_cluster):
|
||||||
bucket = started_cluster.minio_bucket
|
bucket = started_cluster.minio_bucket
|
||||||
instance = started_cluster.instances["dummy"] # type: ClickHouseInstance
|
instance = started_cluster.instances[
|
||||||
|
"dummy_without_named_collections"
|
||||||
|
] # type: ClickHouseInstance
|
||||||
name = "test_table"
|
name = "test_table"
|
||||||
|
|
||||||
instance.query("drop table if exists {}".format(name))
|
instance.query("CREATE USER user")
|
||||||
instance.query(
|
instance.query("GRANT CREATE ON *.* TO user")
|
||||||
"CREATE TABLE {} (id UInt32) ENGINE = S3(s3_conf1, format='CSV')".format(name)
|
instance.query("GRANT SOURCES ON *.* TO user")
|
||||||
|
instance.query("GRANT SELECT ON *.* TO user")
|
||||||
|
|
||||||
|
instance.query(f"drop table if exists {name}", user="user")
|
||||||
|
error = instance.query_and_get_error(
|
||||||
|
f"CREATE TABLE {name} (id UInt32) ENGINE = S3(s3_conf1, format='CSV')"
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"To execute this query it's necessary to have grant NAMED COLLECTION ON s3_conf1"
|
||||||
|
in error
|
||||||
|
)
|
||||||
|
error = instance.query_and_get_error(
|
||||||
|
f"CREATE TABLE {name} (id UInt32) ENGINE = S3(s3_conf1, format='CSV')",
|
||||||
|
user="user",
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"To execute this query it's necessary to have grant NAMED COLLECTION ON s3_conf1"
|
||||||
|
in error
|
||||||
)
|
)
|
||||||
|
|
||||||
instance.query("INSERT INTO {} SELECT number FROM numbers(10)".format(name))
|
instance.query("GRANT NAMED COLLECTION ON s3_conf1 TO user", user="admin")
|
||||||
result = instance.query("SELECT * FROM {}".format(name))
|
instance.query(
|
||||||
|
f"CREATE TABLE {name} (id UInt32) ENGINE = S3(s3_conf1, format='CSV')",
|
||||||
|
user="user",
|
||||||
|
)
|
||||||
|
|
||||||
|
instance.query(f"INSERT INTO {name} SELECT number FROM numbers(10)")
|
||||||
|
result = instance.query(f"SELECT * FROM {name}")
|
||||||
assert result == instance.query("SELECT number FROM numbers(10)")
|
assert result == instance.query("SELECT number FROM numbers(10)")
|
||||||
|
|
||||||
result = instance.query(
|
result = instance.query(
|
||||||
"SELECT * FROM s3(s3_conf1, format='CSV', structure='id UInt32')"
|
"SELECT * FROM s3(s3_conf1, format='CSV', structure='id UInt32')", user="user"
|
||||||
)
|
)
|
||||||
assert result == instance.query("SELECT number FROM numbers(10)")
|
assert result == instance.query("SELECT number FROM numbers(10)")
|
||||||
|
|
||||||
result = instance.query_and_get_error("SELECT * FROM s3(no_collection)")
|
error = instance.query_and_get_error("SELECT * FROM s3(no_collection)")
|
||||||
assert "There is no named collection `no_collection`" in result
|
assert (
|
||||||
|
"To execute this query it's necessary to have grant NAMED COLLECTION ON no_collection"
|
||||||
|
in error
|
||||||
|
)
|
||||||
|
error = instance.query_and_get_error("SELECT * FROM s3(no_collection)", user="user")
|
||||||
|
assert (
|
||||||
|
"To execute this query it's necessary to have grant NAMED COLLECTION ON no_collection"
|
||||||
|
in error
|
||||||
|
)
|
||||||
|
instance = started_cluster.instances["dummy"] # has named collection access
|
||||||
|
error = instance.query_and_get_error("SELECT * FROM s3(no_collection)")
|
||||||
|
assert "There is no named collection `no_collection`" in error
|
||||||
|
|
||||||
|
|
||||||
result = ""
|
result = ""
|
||||||
|
@ -92,6 +92,7 @@ def started_cluster():
|
|||||||
"configs/use_environment_credentials.xml",
|
"configs/use_environment_credentials.xml",
|
||||||
"configs/named_collections.xml",
|
"configs/named_collections.xml",
|
||||||
],
|
],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
)
|
)
|
||||||
|
|
||||||
logging.info("Starting cluster...")
|
logging.info("Starting cluster...")
|
||||||
|
9
tests/integration/test_storage_url/configs/users.xml
Normal file
9
tests/integration/test_storage_url/configs/users.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -6,6 +6,7 @@ cluster = ClickHouseCluster(__file__)
|
|||||||
node1 = cluster.add_instance(
|
node1 = cluster.add_instance(
|
||||||
"node1",
|
"node1",
|
||||||
main_configs=["configs/conf.xml", "configs/named_collections.xml"],
|
main_configs=["configs/conf.xml", "configs/named_collections.xml"],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
with_nginx=True,
|
with_nginx=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<clickhouse>
|
||||||
|
<users>
|
||||||
|
<default>
|
||||||
|
<password></password>
|
||||||
|
<profile>default</profile>
|
||||||
|
<named_collection_control>1</named_collection_control>
|
||||||
|
</default>
|
||||||
|
</users>
|
||||||
|
</clickhouse>
|
@ -16,6 +16,7 @@ def started_cluster(request):
|
|||||||
main_configs=[
|
main_configs=[
|
||||||
"configs_secure/config.d/ssl_conf.xml",
|
"configs_secure/config.d/ssl_conf.xml",
|
||||||
],
|
],
|
||||||
|
user_configs=["configs/users.xml"],
|
||||||
with_mongo_secure=request.param,
|
with_mongo_secure=request.param,
|
||||||
)
|
)
|
||||||
cluster.start()
|
cluster.start()
|
||||||
|
@ -39,7 +39,7 @@ ALTER MOVE PARTITION ['ALTER MOVE PART','MOVE PARTITION','MOVE PART'] TABLE ALTE
|
|||||||
ALTER FETCH PARTITION ['ALTER FETCH PART','FETCH PARTITION'] TABLE ALTER TABLE
|
ALTER FETCH PARTITION ['ALTER FETCH PART','FETCH PARTITION'] TABLE ALTER TABLE
|
||||||
ALTER FREEZE PARTITION ['FREEZE PARTITION','UNFREEZE'] TABLE ALTER TABLE
|
ALTER FREEZE PARTITION ['FREEZE PARTITION','UNFREEZE'] TABLE ALTER TABLE
|
||||||
ALTER DATABASE SETTINGS ['ALTER DATABASE SETTING','ALTER MODIFY DATABASE SETTING','MODIFY DATABASE SETTING'] DATABASE ALTER DATABASE
|
ALTER DATABASE SETTINGS ['ALTER DATABASE SETTING','ALTER MODIFY DATABASE SETTING','MODIFY DATABASE SETTING'] DATABASE ALTER DATABASE
|
||||||
ALTER NAMED COLLECTION [] NAMED_COLLECTION NAMED COLLECTION CONTROL
|
ALTER NAMED COLLECTION [] NAMED_COLLECTION NAMED COLLECTION ADMIN
|
||||||
ALTER TABLE [] \N ALTER
|
ALTER TABLE [] \N ALTER
|
||||||
ALTER DATABASE [] \N ALTER
|
ALTER DATABASE [] \N ALTER
|
||||||
ALTER VIEW REFRESH ['ALTER LIVE VIEW REFRESH','REFRESH VIEW'] VIEW ALTER VIEW
|
ALTER VIEW REFRESH ['ALTER LIVE VIEW REFRESH','REFRESH VIEW'] VIEW ALTER VIEW
|
||||||
@ -53,14 +53,14 @@ CREATE DICTIONARY [] DICTIONARY CREATE
|
|||||||
CREATE TEMPORARY TABLE [] GLOBAL CREATE ARBITRARY TEMPORARY TABLE
|
CREATE TEMPORARY TABLE [] GLOBAL CREATE ARBITRARY TEMPORARY TABLE
|
||||||
CREATE ARBITRARY TEMPORARY TABLE [] GLOBAL CREATE
|
CREATE ARBITRARY TEMPORARY TABLE [] GLOBAL CREATE
|
||||||
CREATE FUNCTION [] GLOBAL CREATE
|
CREATE FUNCTION [] GLOBAL CREATE
|
||||||
CREATE NAMED COLLECTION [] NAMED_COLLECTION NAMED COLLECTION CONTROL
|
CREATE NAMED COLLECTION [] NAMED_COLLECTION NAMED COLLECTION ADMIN
|
||||||
CREATE [] \N ALL
|
CREATE [] \N ALL
|
||||||
DROP DATABASE [] DATABASE DROP
|
DROP DATABASE [] DATABASE DROP
|
||||||
DROP TABLE [] TABLE DROP
|
DROP TABLE [] TABLE DROP
|
||||||
DROP VIEW [] VIEW DROP
|
DROP VIEW [] VIEW DROP
|
||||||
DROP DICTIONARY [] DICTIONARY DROP
|
DROP DICTIONARY [] DICTIONARY DROP
|
||||||
DROP FUNCTION [] GLOBAL DROP
|
DROP FUNCTION [] GLOBAL DROP
|
||||||
DROP NAMED COLLECTION [] NAMED_COLLECTION NAMED COLLECTION CONTROL
|
DROP NAMED COLLECTION [] NAMED_COLLECTION NAMED COLLECTION ADMIN
|
||||||
DROP [] \N ALL
|
DROP [] \N ALL
|
||||||
UNDROP TABLE [] TABLE ALL
|
UNDROP TABLE [] TABLE ALL
|
||||||
TRUNCATE ['TRUNCATE TABLE'] TABLE ALL
|
TRUNCATE ['TRUNCATE TABLE'] TABLE ALL
|
||||||
@ -92,9 +92,10 @@ SHOW QUOTAS ['SHOW CREATE QUOTA'] GLOBAL SHOW ACCESS
|
|||||||
SHOW SETTINGS PROFILES ['SHOW PROFILES','SHOW CREATE SETTINGS PROFILE','SHOW CREATE PROFILE'] GLOBAL SHOW ACCESS
|
SHOW SETTINGS PROFILES ['SHOW PROFILES','SHOW CREATE SETTINGS PROFILE','SHOW CREATE PROFILE'] GLOBAL SHOW ACCESS
|
||||||
SHOW ACCESS [] \N ACCESS MANAGEMENT
|
SHOW ACCESS [] \N ACCESS MANAGEMENT
|
||||||
ACCESS MANAGEMENT [] \N ALL
|
ACCESS MANAGEMENT [] \N ALL
|
||||||
SHOW NAMED COLLECTIONS ['SHOW NAMED COLLECTIONS'] NAMED_COLLECTION NAMED COLLECTION CONTROL
|
SHOW NAMED COLLECTIONS ['SHOW NAMED COLLECTIONS'] NAMED_COLLECTION NAMED COLLECTION ADMIN
|
||||||
SHOW NAMED COLLECTIONS SECRETS ['SHOW NAMED COLLECTIONS SECRETS'] NAMED_COLLECTION NAMED COLLECTION CONTROL
|
SHOW NAMED COLLECTIONS SECRETS ['SHOW NAMED COLLECTIONS SECRETS'] NAMED_COLLECTION NAMED COLLECTION ADMIN
|
||||||
NAMED COLLECTION CONTROL [] NAMED_COLLECTION ALL
|
NAMED COLLECTION ['NAMED COLLECTION USAGE','USE NAMED COLLECTION'] NAMED_COLLECTION NAMED COLLECTION ADMIN
|
||||||
|
NAMED COLLECTION ADMIN ['NAMED COLLECTION CONTROL'] NAMED_COLLECTION ALL
|
||||||
SYSTEM SHUTDOWN ['SYSTEM KILL','SHUTDOWN'] GLOBAL SYSTEM
|
SYSTEM SHUTDOWN ['SYSTEM KILL','SHUTDOWN'] GLOBAL SYSTEM
|
||||||
SYSTEM DROP DNS CACHE ['SYSTEM DROP DNS','DROP DNS CACHE','DROP DNS'] GLOBAL SYSTEM DROP CACHE
|
SYSTEM DROP DNS CACHE ['SYSTEM DROP DNS','DROP DNS CACHE','DROP DNS'] GLOBAL SYSTEM DROP CACHE
|
||||||
SYSTEM DROP MARK CACHE ['SYSTEM DROP MARK','DROP MARK CACHE','DROP MARKS'] GLOBAL SYSTEM DROP CACHE
|
SYSTEM DROP MARK CACHE ['SYSTEM DROP MARK','DROP MARK CACHE','DROP MARKS'] GLOBAL SYSTEM DROP CACHE
|
||||||
|
@ -297,7 +297,7 @@ CREATE TABLE system.grants
|
|||||||
(
|
(
|
||||||
`user_name` Nullable(String),
|
`user_name` Nullable(String),
|
||||||
`role_name` Nullable(String),
|
`role_name` Nullable(String),
|
||||||
`access_type` Enum16('SHOW DATABASES' = 0, 'SHOW TABLES' = 1, 'SHOW COLUMNS' = 2, 'SHOW DICTIONARIES' = 3, 'SHOW' = 4, 'SHOW FILESYSTEM CACHES' = 5, 'SELECT' = 6, 'INSERT' = 7, 'ALTER UPDATE' = 8, 'ALTER DELETE' = 9, 'ALTER ADD COLUMN' = 10, 'ALTER MODIFY COLUMN' = 11, 'ALTER DROP COLUMN' = 12, 'ALTER COMMENT COLUMN' = 13, 'ALTER CLEAR COLUMN' = 14, 'ALTER RENAME COLUMN' = 15, 'ALTER MATERIALIZE COLUMN' = 16, 'ALTER COLUMN' = 17, 'ALTER MODIFY COMMENT' = 18, 'ALTER ORDER BY' = 19, 'ALTER SAMPLE BY' = 20, 'ALTER ADD INDEX' = 21, 'ALTER DROP INDEX' = 22, 'ALTER MATERIALIZE INDEX' = 23, 'ALTER CLEAR INDEX' = 24, 'ALTER INDEX' = 25, 'ALTER ADD PROJECTION' = 26, 'ALTER DROP PROJECTION' = 27, 'ALTER MATERIALIZE PROJECTION' = 28, 'ALTER CLEAR PROJECTION' = 29, 'ALTER PROJECTION' = 30, 'ALTER ADD CONSTRAINT' = 31, 'ALTER DROP CONSTRAINT' = 32, 'ALTER CONSTRAINT' = 33, 'ALTER TTL' = 34, 'ALTER MATERIALIZE TTL' = 35, 'ALTER SETTINGS' = 36, 'ALTER MOVE PARTITION' = 37, 'ALTER FETCH PARTITION' = 38, 'ALTER FREEZE PARTITION' = 39, 'ALTER DATABASE SETTINGS' = 40, 'ALTER NAMED COLLECTION' = 41, 'ALTER TABLE' = 42, 'ALTER DATABASE' = 43, 'ALTER VIEW REFRESH' = 44, 'ALTER VIEW MODIFY QUERY' = 45, 'ALTER VIEW' = 46, 'ALTER' = 47, 'CREATE DATABASE' = 48, 'CREATE TABLE' = 49, 'CREATE VIEW' = 50, 'CREATE DICTIONARY' = 51, 'CREATE TEMPORARY TABLE' = 52, 'CREATE ARBITRARY TEMPORARY TABLE' = 53, 'CREATE FUNCTION' = 54, 'CREATE NAMED COLLECTION' = 55, 'CREATE' = 56, 'DROP DATABASE' = 57, 'DROP TABLE' = 58, 'DROP VIEW' = 59, 'DROP DICTIONARY' = 60, 'DROP FUNCTION' = 61, 'DROP NAMED COLLECTION' = 62, 'DROP' = 63, 'UNDROP TABLE' = 64, 'TRUNCATE' = 65, 'OPTIMIZE' = 66, 'BACKUP' = 67, 'KILL QUERY' = 68, 'KILL TRANSACTION' = 69, 'MOVE PARTITION BETWEEN SHARDS' = 70, 'CREATE USER' = 71, 'ALTER USER' = 72, 'DROP USER' = 73, 'CREATE ROLE' = 74, 'ALTER ROLE' = 75, 'DROP ROLE' = 76, 'ROLE ADMIN' = 77, 'CREATE ROW POLICY' = 78, 'ALTER ROW POLICY' = 79, 'DROP ROW POLICY' = 80, 'CREATE QUOTA' = 81, 'ALTER QUOTA' = 82, 'DROP QUOTA' = 83, 'CREATE SETTINGS PROFILE' = 84, 'ALTER SETTINGS PROFILE' = 85, 'DROP SETTINGS PROFILE' = 86, 'SHOW USERS' = 87, 'SHOW ROLES' = 88, 'SHOW ROW POLICIES' = 89, 'SHOW QUOTAS' = 90, 'SHOW SETTINGS PROFILES' = 91, 'SHOW ACCESS' = 92, 'ACCESS MANAGEMENT' = 93, 'SHOW NAMED COLLECTIONS' = 94, 'SHOW NAMED COLLECTIONS SECRETS' = 95, 'NAMED COLLECTION CONTROL' = 96, 'SYSTEM SHUTDOWN' = 97, 'SYSTEM DROP DNS CACHE' = 98, 'SYSTEM DROP MARK CACHE' = 99, 'SYSTEM DROP UNCOMPRESSED CACHE' = 100, 'SYSTEM DROP MMAP CACHE' = 101, 'SYSTEM DROP QUERY CACHE' = 102, 'SYSTEM DROP COMPILED EXPRESSION CACHE' = 103, 'SYSTEM DROP FILESYSTEM CACHE' = 104, 'SYSTEM DROP SCHEMA CACHE' = 105, 'SYSTEM DROP S3 CLIENT CACHE' = 106, 'SYSTEM DROP CACHE' = 107, 'SYSTEM RELOAD CONFIG' = 108, 'SYSTEM RELOAD USERS' = 109, 'SYSTEM RELOAD SYMBOLS' = 110, 'SYSTEM RELOAD DICTIONARY' = 111, 'SYSTEM RELOAD MODEL' = 112, 'SYSTEM RELOAD FUNCTION' = 113, 'SYSTEM RELOAD EMBEDDED DICTIONARIES' = 114, 'SYSTEM RELOAD' = 115, 'SYSTEM RESTART DISK' = 116, 'SYSTEM MERGES' = 117, 'SYSTEM TTL MERGES' = 118, 'SYSTEM FETCHES' = 119, 'SYSTEM MOVES' = 120, 'SYSTEM DISTRIBUTED SENDS' = 121, 'SYSTEM REPLICATED SENDS' = 122, 'SYSTEM SENDS' = 123, 'SYSTEM REPLICATION QUEUES' = 124, 'SYSTEM DROP REPLICA' = 125, 'SYSTEM SYNC REPLICA' = 126, 'SYSTEM RESTART REPLICA' = 127, 'SYSTEM RESTORE REPLICA' = 128, 'SYSTEM WAIT LOADING PARTS' = 129, 'SYSTEM SYNC DATABASE REPLICA' = 130, 'SYSTEM SYNC TRANSACTION LOG' = 131, 'SYSTEM SYNC FILE CACHE' = 132, 'SYSTEM FLUSH DISTRIBUTED' = 133, 'SYSTEM FLUSH LOGS' = 134, 'SYSTEM FLUSH' = 135, 'SYSTEM THREAD FUZZER' = 136, 'SYSTEM UNFREEZE' = 137, 'SYSTEM FAILPOINT' = 138, 'SYSTEM' = 139, 'dictGet' = 140, 'displaySecretsInShowAndSelect' = 141, 'addressToLine' = 142, 'addressToLineWithInlines' = 143, 'addressToSymbol' = 144, 'demangle' = 145, 'INTROSPECTION' = 146, 'FILE' = 147, 'URL' = 148, 'REMOTE' = 149, 'MONGO' = 150, 'REDIS' = 151, 'MEILISEARCH' = 152, 'MYSQL' = 153, 'POSTGRES' = 154, 'SQLITE' = 155, 'ODBC' = 156, 'JDBC' = 157, 'HDFS' = 158, 'S3' = 159, 'HIVE' = 160, 'AZURE' = 161, 'SOURCES' = 162, 'CLUSTER' = 163, 'ALL' = 164, 'NONE' = 165),
|
`access_type` Enum16('SHOW DATABASES' = 0, 'SHOW TABLES' = 1, 'SHOW COLUMNS' = 2, 'SHOW DICTIONARIES' = 3, 'SHOW' = 4, 'SHOW FILESYSTEM CACHES' = 5, 'SELECT' = 6, 'INSERT' = 7, 'ALTER UPDATE' = 8, 'ALTER DELETE' = 9, 'ALTER ADD COLUMN' = 10, 'ALTER MODIFY COLUMN' = 11, 'ALTER DROP COLUMN' = 12, 'ALTER COMMENT COLUMN' = 13, 'ALTER CLEAR COLUMN' = 14, 'ALTER RENAME COLUMN' = 15, 'ALTER MATERIALIZE COLUMN' = 16, 'ALTER COLUMN' = 17, 'ALTER MODIFY COMMENT' = 18, 'ALTER ORDER BY' = 19, 'ALTER SAMPLE BY' = 20, 'ALTER ADD INDEX' = 21, 'ALTER DROP INDEX' = 22, 'ALTER MATERIALIZE INDEX' = 23, 'ALTER CLEAR INDEX' = 24, 'ALTER INDEX' = 25, 'ALTER ADD PROJECTION' = 26, 'ALTER DROP PROJECTION' = 27, 'ALTER MATERIALIZE PROJECTION' = 28, 'ALTER CLEAR PROJECTION' = 29, 'ALTER PROJECTION' = 30, 'ALTER ADD CONSTRAINT' = 31, 'ALTER DROP CONSTRAINT' = 32, 'ALTER CONSTRAINT' = 33, 'ALTER TTL' = 34, 'ALTER MATERIALIZE TTL' = 35, 'ALTER SETTINGS' = 36, 'ALTER MOVE PARTITION' = 37, 'ALTER FETCH PARTITION' = 38, 'ALTER FREEZE PARTITION' = 39, 'ALTER DATABASE SETTINGS' = 40, 'ALTER NAMED COLLECTION' = 41, 'ALTER TABLE' = 42, 'ALTER DATABASE' = 43, 'ALTER VIEW REFRESH' = 44, 'ALTER VIEW MODIFY QUERY' = 45, 'ALTER VIEW' = 46, 'ALTER' = 47, 'CREATE DATABASE' = 48, 'CREATE TABLE' = 49, 'CREATE VIEW' = 50, 'CREATE DICTIONARY' = 51, 'CREATE TEMPORARY TABLE' = 52, 'CREATE ARBITRARY TEMPORARY TABLE' = 53, 'CREATE FUNCTION' = 54, 'CREATE NAMED COLLECTION' = 55, 'CREATE' = 56, 'DROP DATABASE' = 57, 'DROP TABLE' = 58, 'DROP VIEW' = 59, 'DROP DICTIONARY' = 60, 'DROP FUNCTION' = 61, 'DROP NAMED COLLECTION' = 62, 'DROP' = 63, 'UNDROP TABLE' = 64, 'TRUNCATE' = 65, 'OPTIMIZE' = 66, 'BACKUP' = 67, 'KILL QUERY' = 68, 'KILL TRANSACTION' = 69, 'MOVE PARTITION BETWEEN SHARDS' = 70, 'CREATE USER' = 71, 'ALTER USER' = 72, 'DROP USER' = 73, 'CREATE ROLE' = 74, 'ALTER ROLE' = 75, 'DROP ROLE' = 76, 'ROLE ADMIN' = 77, 'CREATE ROW POLICY' = 78, 'ALTER ROW POLICY' = 79, 'DROP ROW POLICY' = 80, 'CREATE QUOTA' = 81, 'ALTER QUOTA' = 82, 'DROP QUOTA' = 83, 'CREATE SETTINGS PROFILE' = 84, 'ALTER SETTINGS PROFILE' = 85, 'DROP SETTINGS PROFILE' = 86, 'SHOW USERS' = 87, 'SHOW ROLES' = 88, 'SHOW ROW POLICIES' = 89, 'SHOW QUOTAS' = 90, 'SHOW SETTINGS PROFILES' = 91, 'SHOW ACCESS' = 92, 'ACCESS MANAGEMENT' = 93, 'SHOW NAMED COLLECTIONS' = 94, 'SHOW NAMED COLLECTIONS SECRETS' = 95, 'NAMED COLLECTION' = 96, 'NAMED COLLECTION ADMIN' = 97, 'SYSTEM SHUTDOWN' = 98, 'SYSTEM DROP DNS CACHE' = 99, 'SYSTEM DROP MARK CACHE' = 100, 'SYSTEM DROP UNCOMPRESSED CACHE' = 101, 'SYSTEM DROP MMAP CACHE' = 102, 'SYSTEM DROP QUERY CACHE' = 103, 'SYSTEM DROP COMPILED EXPRESSION CACHE' = 104, 'SYSTEM DROP FILESYSTEM CACHE' = 105, 'SYSTEM DROP SCHEMA CACHE' = 106, 'SYSTEM DROP S3 CLIENT CACHE' = 107, 'SYSTEM DROP CACHE' = 108, 'SYSTEM RELOAD CONFIG' = 109, 'SYSTEM RELOAD USERS' = 110, 'SYSTEM RELOAD SYMBOLS' = 111, 'SYSTEM RELOAD DICTIONARY' = 112, 'SYSTEM RELOAD MODEL' = 113, 'SYSTEM RELOAD FUNCTION' = 114, 'SYSTEM RELOAD EMBEDDED DICTIONARIES' = 115, 'SYSTEM RELOAD' = 116, 'SYSTEM RESTART DISK' = 117, 'SYSTEM MERGES' = 118, 'SYSTEM TTL MERGES' = 119, 'SYSTEM FETCHES' = 120, 'SYSTEM MOVES' = 121, 'SYSTEM DISTRIBUTED SENDS' = 122, 'SYSTEM REPLICATED SENDS' = 123, 'SYSTEM SENDS' = 124, 'SYSTEM REPLICATION QUEUES' = 125, 'SYSTEM DROP REPLICA' = 126, 'SYSTEM SYNC REPLICA' = 127, 'SYSTEM RESTART REPLICA' = 128, 'SYSTEM RESTORE REPLICA' = 129, 'SYSTEM WAIT LOADING PARTS' = 130, 'SYSTEM SYNC DATABASE REPLICA' = 131, 'SYSTEM SYNC TRANSACTION LOG' = 132, 'SYSTEM SYNC FILE CACHE' = 133, 'SYSTEM FLUSH DISTRIBUTED' = 134, 'SYSTEM FLUSH LOGS' = 135, 'SYSTEM FLUSH' = 136, 'SYSTEM THREAD FUZZER' = 137, 'SYSTEM UNFREEZE' = 138, 'SYSTEM FAILPOINT' = 139, 'SYSTEM' = 140, 'dictGet' = 141, 'displaySecretsInShowAndSelect' = 142, 'addressToLine' = 143, 'addressToLineWithInlines' = 144, 'addressToSymbol' = 145, 'demangle' = 146, 'INTROSPECTION' = 147, 'FILE' = 148, 'URL' = 149, 'REMOTE' = 150, 'MONGO' = 151, 'REDIS' = 152, 'MEILISEARCH' = 153, 'MYSQL' = 154, 'POSTGRES' = 155, 'SQLITE' = 156, 'ODBC' = 157, 'JDBC' = 158, 'HDFS' = 159, 'S3' = 160, 'HIVE' = 161, 'AZURE' = 162, 'SOURCES' = 163, 'CLUSTER' = 164, 'ALL' = 165, 'NONE' = 166),
|
||||||
`database` Nullable(String),
|
`database` Nullable(String),
|
||||||
`table` Nullable(String),
|
`table` Nullable(String),
|
||||||
`column` Nullable(String),
|
`column` Nullable(String),
|
||||||
@ -582,10 +582,10 @@ ENGINE = SystemPartsColumns
|
|||||||
COMMENT 'SYSTEM TABLE is built on the fly.'
|
COMMENT 'SYSTEM TABLE is built on the fly.'
|
||||||
CREATE TABLE system.privileges
|
CREATE TABLE system.privileges
|
||||||
(
|
(
|
||||||
`privilege` Enum16('SHOW DATABASES' = 0, 'SHOW TABLES' = 1, 'SHOW COLUMNS' = 2, 'SHOW DICTIONARIES' = 3, 'SHOW' = 4, 'SHOW FILESYSTEM CACHES' = 5, 'SELECT' = 6, 'INSERT' = 7, 'ALTER UPDATE' = 8, 'ALTER DELETE' = 9, 'ALTER ADD COLUMN' = 10, 'ALTER MODIFY COLUMN' = 11, 'ALTER DROP COLUMN' = 12, 'ALTER COMMENT COLUMN' = 13, 'ALTER CLEAR COLUMN' = 14, 'ALTER RENAME COLUMN' = 15, 'ALTER MATERIALIZE COLUMN' = 16, 'ALTER COLUMN' = 17, 'ALTER MODIFY COMMENT' = 18, 'ALTER ORDER BY' = 19, 'ALTER SAMPLE BY' = 20, 'ALTER ADD INDEX' = 21, 'ALTER DROP INDEX' = 22, 'ALTER MATERIALIZE INDEX' = 23, 'ALTER CLEAR INDEX' = 24, 'ALTER INDEX' = 25, 'ALTER ADD PROJECTION' = 26, 'ALTER DROP PROJECTION' = 27, 'ALTER MATERIALIZE PROJECTION' = 28, 'ALTER CLEAR PROJECTION' = 29, 'ALTER PROJECTION' = 30, 'ALTER ADD CONSTRAINT' = 31, 'ALTER DROP CONSTRAINT' = 32, 'ALTER CONSTRAINT' = 33, 'ALTER TTL' = 34, 'ALTER MATERIALIZE TTL' = 35, 'ALTER SETTINGS' = 36, 'ALTER MOVE PARTITION' = 37, 'ALTER FETCH PARTITION' = 38, 'ALTER FREEZE PARTITION' = 39, 'ALTER DATABASE SETTINGS' = 40, 'ALTER NAMED COLLECTION' = 41, 'ALTER TABLE' = 42, 'ALTER DATABASE' = 43, 'ALTER VIEW REFRESH' = 44, 'ALTER VIEW MODIFY QUERY' = 45, 'ALTER VIEW' = 46, 'ALTER' = 47, 'CREATE DATABASE' = 48, 'CREATE TABLE' = 49, 'CREATE VIEW' = 50, 'CREATE DICTIONARY' = 51, 'CREATE TEMPORARY TABLE' = 52, 'CREATE ARBITRARY TEMPORARY TABLE' = 53, 'CREATE FUNCTION' = 54, 'CREATE NAMED COLLECTION' = 55, 'CREATE' = 56, 'DROP DATABASE' = 57, 'DROP TABLE' = 58, 'DROP VIEW' = 59, 'DROP DICTIONARY' = 60, 'DROP FUNCTION' = 61, 'DROP NAMED COLLECTION' = 62, 'DROP' = 63, 'UNDROP TABLE' = 64, 'TRUNCATE' = 65, 'OPTIMIZE' = 66, 'BACKUP' = 67, 'KILL QUERY' = 68, 'KILL TRANSACTION' = 69, 'MOVE PARTITION BETWEEN SHARDS' = 70, 'CREATE USER' = 71, 'ALTER USER' = 72, 'DROP USER' = 73, 'CREATE ROLE' = 74, 'ALTER ROLE' = 75, 'DROP ROLE' = 76, 'ROLE ADMIN' = 77, 'CREATE ROW POLICY' = 78, 'ALTER ROW POLICY' = 79, 'DROP ROW POLICY' = 80, 'CREATE QUOTA' = 81, 'ALTER QUOTA' = 82, 'DROP QUOTA' = 83, 'CREATE SETTINGS PROFILE' = 84, 'ALTER SETTINGS PROFILE' = 85, 'DROP SETTINGS PROFILE' = 86, 'SHOW USERS' = 87, 'SHOW ROLES' = 88, 'SHOW ROW POLICIES' = 89, 'SHOW QUOTAS' = 90, 'SHOW SETTINGS PROFILES' = 91, 'SHOW ACCESS' = 92, 'ACCESS MANAGEMENT' = 93, 'SHOW NAMED COLLECTIONS' = 94, 'SHOW NAMED COLLECTIONS SECRETS' = 95, 'NAMED COLLECTION CONTROL' = 96, 'SYSTEM SHUTDOWN' = 97, 'SYSTEM DROP DNS CACHE' = 98, 'SYSTEM DROP MARK CACHE' = 99, 'SYSTEM DROP UNCOMPRESSED CACHE' = 100, 'SYSTEM DROP MMAP CACHE' = 101, 'SYSTEM DROP QUERY CACHE' = 102, 'SYSTEM DROP COMPILED EXPRESSION CACHE' = 103, 'SYSTEM DROP FILESYSTEM CACHE' = 104, 'SYSTEM DROP SCHEMA CACHE' = 105, 'SYSTEM DROP S3 CLIENT CACHE' = 106, 'SYSTEM DROP CACHE' = 107, 'SYSTEM RELOAD CONFIG' = 108, 'SYSTEM RELOAD USERS' = 109, 'SYSTEM RELOAD SYMBOLS' = 110, 'SYSTEM RELOAD DICTIONARY' = 111, 'SYSTEM RELOAD MODEL' = 112, 'SYSTEM RELOAD FUNCTION' = 113, 'SYSTEM RELOAD EMBEDDED DICTIONARIES' = 114, 'SYSTEM RELOAD' = 115, 'SYSTEM RESTART DISK' = 116, 'SYSTEM MERGES' = 117, 'SYSTEM TTL MERGES' = 118, 'SYSTEM FETCHES' = 119, 'SYSTEM MOVES' = 120, 'SYSTEM DISTRIBUTED SENDS' = 121, 'SYSTEM REPLICATED SENDS' = 122, 'SYSTEM SENDS' = 123, 'SYSTEM REPLICATION QUEUES' = 124, 'SYSTEM DROP REPLICA' = 125, 'SYSTEM SYNC REPLICA' = 126, 'SYSTEM RESTART REPLICA' = 127, 'SYSTEM RESTORE REPLICA' = 128, 'SYSTEM WAIT LOADING PARTS' = 129, 'SYSTEM SYNC DATABASE REPLICA' = 130, 'SYSTEM SYNC TRANSACTION LOG' = 131, 'SYSTEM SYNC FILE CACHE' = 132, 'SYSTEM FLUSH DISTRIBUTED' = 133, 'SYSTEM FLUSH LOGS' = 134, 'SYSTEM FLUSH' = 135, 'SYSTEM THREAD FUZZER' = 136, 'SYSTEM UNFREEZE' = 137, 'SYSTEM FAILPOINT' = 138, 'SYSTEM' = 139, 'dictGet' = 140, 'displaySecretsInShowAndSelect' = 141, 'addressToLine' = 142, 'addressToLineWithInlines' = 143, 'addressToSymbol' = 144, 'demangle' = 145, 'INTROSPECTION' = 146, 'FILE' = 147, 'URL' = 148, 'REMOTE' = 149, 'MONGO' = 150, 'REDIS' = 151, 'MEILISEARCH' = 152, 'MYSQL' = 153, 'POSTGRES' = 154, 'SQLITE' = 155, 'ODBC' = 156, 'JDBC' = 157, 'HDFS' = 158, 'S3' = 159, 'HIVE' = 160, 'AZURE' = 161, 'SOURCES' = 162, 'CLUSTER' = 163, 'ALL' = 164, 'NONE' = 165),
|
`privilege` Enum16('SHOW DATABASES' = 0, 'SHOW TABLES' = 1, 'SHOW COLUMNS' = 2, 'SHOW DICTIONARIES' = 3, 'SHOW' = 4, 'SHOW FILESYSTEM CACHES' = 5, 'SELECT' = 6, 'INSERT' = 7, 'ALTER UPDATE' = 8, 'ALTER DELETE' = 9, 'ALTER ADD COLUMN' = 10, 'ALTER MODIFY COLUMN' = 11, 'ALTER DROP COLUMN' = 12, 'ALTER COMMENT COLUMN' = 13, 'ALTER CLEAR COLUMN' = 14, 'ALTER RENAME COLUMN' = 15, 'ALTER MATERIALIZE COLUMN' = 16, 'ALTER COLUMN' = 17, 'ALTER MODIFY COMMENT' = 18, 'ALTER ORDER BY' = 19, 'ALTER SAMPLE BY' = 20, 'ALTER ADD INDEX' = 21, 'ALTER DROP INDEX' = 22, 'ALTER MATERIALIZE INDEX' = 23, 'ALTER CLEAR INDEX' = 24, 'ALTER INDEX' = 25, 'ALTER ADD PROJECTION' = 26, 'ALTER DROP PROJECTION' = 27, 'ALTER MATERIALIZE PROJECTION' = 28, 'ALTER CLEAR PROJECTION' = 29, 'ALTER PROJECTION' = 30, 'ALTER ADD CONSTRAINT' = 31, 'ALTER DROP CONSTRAINT' = 32, 'ALTER CONSTRAINT' = 33, 'ALTER TTL' = 34, 'ALTER MATERIALIZE TTL' = 35, 'ALTER SETTINGS' = 36, 'ALTER MOVE PARTITION' = 37, 'ALTER FETCH PARTITION' = 38, 'ALTER FREEZE PARTITION' = 39, 'ALTER DATABASE SETTINGS' = 40, 'ALTER NAMED COLLECTION' = 41, 'ALTER TABLE' = 42, 'ALTER DATABASE' = 43, 'ALTER VIEW REFRESH' = 44, 'ALTER VIEW MODIFY QUERY' = 45, 'ALTER VIEW' = 46, 'ALTER' = 47, 'CREATE DATABASE' = 48, 'CREATE TABLE' = 49, 'CREATE VIEW' = 50, 'CREATE DICTIONARY' = 51, 'CREATE TEMPORARY TABLE' = 52, 'CREATE ARBITRARY TEMPORARY TABLE' = 53, 'CREATE FUNCTION' = 54, 'CREATE NAMED COLLECTION' = 55, 'CREATE' = 56, 'DROP DATABASE' = 57, 'DROP TABLE' = 58, 'DROP VIEW' = 59, 'DROP DICTIONARY' = 60, 'DROP FUNCTION' = 61, 'DROP NAMED COLLECTION' = 62, 'DROP' = 63, 'UNDROP TABLE' = 64, 'TRUNCATE' = 65, 'OPTIMIZE' = 66, 'BACKUP' = 67, 'KILL QUERY' = 68, 'KILL TRANSACTION' = 69, 'MOVE PARTITION BETWEEN SHARDS' = 70, 'CREATE USER' = 71, 'ALTER USER' = 72, 'DROP USER' = 73, 'CREATE ROLE' = 74, 'ALTER ROLE' = 75, 'DROP ROLE' = 76, 'ROLE ADMIN' = 77, 'CREATE ROW POLICY' = 78, 'ALTER ROW POLICY' = 79, 'DROP ROW POLICY' = 80, 'CREATE QUOTA' = 81, 'ALTER QUOTA' = 82, 'DROP QUOTA' = 83, 'CREATE SETTINGS PROFILE' = 84, 'ALTER SETTINGS PROFILE' = 85, 'DROP SETTINGS PROFILE' = 86, 'SHOW USERS' = 87, 'SHOW ROLES' = 88, 'SHOW ROW POLICIES' = 89, 'SHOW QUOTAS' = 90, 'SHOW SETTINGS PROFILES' = 91, 'SHOW ACCESS' = 92, 'ACCESS MANAGEMENT' = 93, 'SHOW NAMED COLLECTIONS' = 94, 'SHOW NAMED COLLECTIONS SECRETS' = 95, 'NAMED COLLECTION' = 96, 'NAMED COLLECTION ADMIN' = 97, 'SYSTEM SHUTDOWN' = 98, 'SYSTEM DROP DNS CACHE' = 99, 'SYSTEM DROP MARK CACHE' = 100, 'SYSTEM DROP UNCOMPRESSED CACHE' = 101, 'SYSTEM DROP MMAP CACHE' = 102, 'SYSTEM DROP QUERY CACHE' = 103, 'SYSTEM DROP COMPILED EXPRESSION CACHE' = 104, 'SYSTEM DROP FILESYSTEM CACHE' = 105, 'SYSTEM DROP SCHEMA CACHE' = 106, 'SYSTEM DROP S3 CLIENT CACHE' = 107, 'SYSTEM DROP CACHE' = 108, 'SYSTEM RELOAD CONFIG' = 109, 'SYSTEM RELOAD USERS' = 110, 'SYSTEM RELOAD SYMBOLS' = 111, 'SYSTEM RELOAD DICTIONARY' = 112, 'SYSTEM RELOAD MODEL' = 113, 'SYSTEM RELOAD FUNCTION' = 114, 'SYSTEM RELOAD EMBEDDED DICTIONARIES' = 115, 'SYSTEM RELOAD' = 116, 'SYSTEM RESTART DISK' = 117, 'SYSTEM MERGES' = 118, 'SYSTEM TTL MERGES' = 119, 'SYSTEM FETCHES' = 120, 'SYSTEM MOVES' = 121, 'SYSTEM DISTRIBUTED SENDS' = 122, 'SYSTEM REPLICATED SENDS' = 123, 'SYSTEM SENDS' = 124, 'SYSTEM REPLICATION QUEUES' = 125, 'SYSTEM DROP REPLICA' = 126, 'SYSTEM SYNC REPLICA' = 127, 'SYSTEM RESTART REPLICA' = 128, 'SYSTEM RESTORE REPLICA' = 129, 'SYSTEM WAIT LOADING PARTS' = 130, 'SYSTEM SYNC DATABASE REPLICA' = 131, 'SYSTEM SYNC TRANSACTION LOG' = 132, 'SYSTEM SYNC FILE CACHE' = 133, 'SYSTEM FLUSH DISTRIBUTED' = 134, 'SYSTEM FLUSH LOGS' = 135, 'SYSTEM FLUSH' = 136, 'SYSTEM THREAD FUZZER' = 137, 'SYSTEM UNFREEZE' = 138, 'SYSTEM FAILPOINT' = 139, 'SYSTEM' = 140, 'dictGet' = 141, 'displaySecretsInShowAndSelect' = 142, 'addressToLine' = 143, 'addressToLineWithInlines' = 144, 'addressToSymbol' = 145, 'demangle' = 146, 'INTROSPECTION' = 147, 'FILE' = 148, 'URL' = 149, 'REMOTE' = 150, 'MONGO' = 151, 'REDIS' = 152, 'MEILISEARCH' = 153, 'MYSQL' = 154, 'POSTGRES' = 155, 'SQLITE' = 156, 'ODBC' = 157, 'JDBC' = 158, 'HDFS' = 159, 'S3' = 160, 'HIVE' = 161, 'AZURE' = 162, 'SOURCES' = 163, 'CLUSTER' = 164, 'ALL' = 165, 'NONE' = 166),
|
||||||
`aliases` Array(String),
|
`aliases` Array(String),
|
||||||
`level` Nullable(Enum8('GLOBAL' = 0, 'DATABASE' = 1, 'TABLE' = 2, 'DICTIONARY' = 3, 'VIEW' = 4, 'COLUMN' = 5, 'NAMED_COLLECTION' = 6)),
|
`level` Nullable(Enum8('GLOBAL' = 0, 'DATABASE' = 1, 'TABLE' = 2, 'DICTIONARY' = 3, 'VIEW' = 4, 'COLUMN' = 5, 'NAMED_COLLECTION' = 6)),
|
||||||
`parent_group` Nullable(Enum16('SHOW DATABASES' = 0, 'SHOW TABLES' = 1, 'SHOW COLUMNS' = 2, 'SHOW DICTIONARIES' = 3, 'SHOW' = 4, 'SHOW FILESYSTEM CACHES' = 5, 'SELECT' = 6, 'INSERT' = 7, 'ALTER UPDATE' = 8, 'ALTER DELETE' = 9, 'ALTER ADD COLUMN' = 10, 'ALTER MODIFY COLUMN' = 11, 'ALTER DROP COLUMN' = 12, 'ALTER COMMENT COLUMN' = 13, 'ALTER CLEAR COLUMN' = 14, 'ALTER RENAME COLUMN' = 15, 'ALTER MATERIALIZE COLUMN' = 16, 'ALTER COLUMN' = 17, 'ALTER MODIFY COMMENT' = 18, 'ALTER ORDER BY' = 19, 'ALTER SAMPLE BY' = 20, 'ALTER ADD INDEX' = 21, 'ALTER DROP INDEX' = 22, 'ALTER MATERIALIZE INDEX' = 23, 'ALTER CLEAR INDEX' = 24, 'ALTER INDEX' = 25, 'ALTER ADD PROJECTION' = 26, 'ALTER DROP PROJECTION' = 27, 'ALTER MATERIALIZE PROJECTION' = 28, 'ALTER CLEAR PROJECTION' = 29, 'ALTER PROJECTION' = 30, 'ALTER ADD CONSTRAINT' = 31, 'ALTER DROP CONSTRAINT' = 32, 'ALTER CONSTRAINT' = 33, 'ALTER TTL' = 34, 'ALTER MATERIALIZE TTL' = 35, 'ALTER SETTINGS' = 36, 'ALTER MOVE PARTITION' = 37, 'ALTER FETCH PARTITION' = 38, 'ALTER FREEZE PARTITION' = 39, 'ALTER DATABASE SETTINGS' = 40, 'ALTER NAMED COLLECTION' = 41, 'ALTER TABLE' = 42, 'ALTER DATABASE' = 43, 'ALTER VIEW REFRESH' = 44, 'ALTER VIEW MODIFY QUERY' = 45, 'ALTER VIEW' = 46, 'ALTER' = 47, 'CREATE DATABASE' = 48, 'CREATE TABLE' = 49, 'CREATE VIEW' = 50, 'CREATE DICTIONARY' = 51, 'CREATE TEMPORARY TABLE' = 52, 'CREATE ARBITRARY TEMPORARY TABLE' = 53, 'CREATE FUNCTION' = 54, 'CREATE NAMED COLLECTION' = 55, 'CREATE' = 56, 'DROP DATABASE' = 57, 'DROP TABLE' = 58, 'DROP VIEW' = 59, 'DROP DICTIONARY' = 60, 'DROP FUNCTION' = 61, 'DROP NAMED COLLECTION' = 62, 'DROP' = 63, 'UNDROP TABLE' = 64, 'TRUNCATE' = 65, 'OPTIMIZE' = 66, 'BACKUP' = 67, 'KILL QUERY' = 68, 'KILL TRANSACTION' = 69, 'MOVE PARTITION BETWEEN SHARDS' = 70, 'CREATE USER' = 71, 'ALTER USER' = 72, 'DROP USER' = 73, 'CREATE ROLE' = 74, 'ALTER ROLE' = 75, 'DROP ROLE' = 76, 'ROLE ADMIN' = 77, 'CREATE ROW POLICY' = 78, 'ALTER ROW POLICY' = 79, 'DROP ROW POLICY' = 80, 'CREATE QUOTA' = 81, 'ALTER QUOTA' = 82, 'DROP QUOTA' = 83, 'CREATE SETTINGS PROFILE' = 84, 'ALTER SETTINGS PROFILE' = 85, 'DROP SETTINGS PROFILE' = 86, 'SHOW USERS' = 87, 'SHOW ROLES' = 88, 'SHOW ROW POLICIES' = 89, 'SHOW QUOTAS' = 90, 'SHOW SETTINGS PROFILES' = 91, 'SHOW ACCESS' = 92, 'ACCESS MANAGEMENT' = 93, 'SHOW NAMED COLLECTIONS' = 94, 'SHOW NAMED COLLECTIONS SECRETS' = 95, 'NAMED COLLECTION CONTROL' = 96, 'SYSTEM SHUTDOWN' = 97, 'SYSTEM DROP DNS CACHE' = 98, 'SYSTEM DROP MARK CACHE' = 99, 'SYSTEM DROP UNCOMPRESSED CACHE' = 100, 'SYSTEM DROP MMAP CACHE' = 101, 'SYSTEM DROP QUERY CACHE' = 102, 'SYSTEM DROP COMPILED EXPRESSION CACHE' = 103, 'SYSTEM DROP FILESYSTEM CACHE' = 104, 'SYSTEM DROP SCHEMA CACHE' = 105, 'SYSTEM DROP S3 CLIENT CACHE' = 106, 'SYSTEM DROP CACHE' = 107, 'SYSTEM RELOAD CONFIG' = 108, 'SYSTEM RELOAD USERS' = 109, 'SYSTEM RELOAD SYMBOLS' = 110, 'SYSTEM RELOAD DICTIONARY' = 111, 'SYSTEM RELOAD MODEL' = 112, 'SYSTEM RELOAD FUNCTION' = 113, 'SYSTEM RELOAD EMBEDDED DICTIONARIES' = 114, 'SYSTEM RELOAD' = 115, 'SYSTEM RESTART DISK' = 116, 'SYSTEM MERGES' = 117, 'SYSTEM TTL MERGES' = 118, 'SYSTEM FETCHES' = 119, 'SYSTEM MOVES' = 120, 'SYSTEM DISTRIBUTED SENDS' = 121, 'SYSTEM REPLICATED SENDS' = 122, 'SYSTEM SENDS' = 123, 'SYSTEM REPLICATION QUEUES' = 124, 'SYSTEM DROP REPLICA' = 125, 'SYSTEM SYNC REPLICA' = 126, 'SYSTEM RESTART REPLICA' = 127, 'SYSTEM RESTORE REPLICA' = 128, 'SYSTEM WAIT LOADING PARTS' = 129, 'SYSTEM SYNC DATABASE REPLICA' = 130, 'SYSTEM SYNC TRANSACTION LOG' = 131, 'SYSTEM SYNC FILE CACHE' = 132, 'SYSTEM FLUSH DISTRIBUTED' = 133, 'SYSTEM FLUSH LOGS' = 134, 'SYSTEM FLUSH' = 135, 'SYSTEM THREAD FUZZER' = 136, 'SYSTEM UNFREEZE' = 137, 'SYSTEM FAILPOINT' = 138, 'SYSTEM' = 139, 'dictGet' = 140, 'displaySecretsInShowAndSelect' = 141, 'addressToLine' = 142, 'addressToLineWithInlines' = 143, 'addressToSymbol' = 144, 'demangle' = 145, 'INTROSPECTION' = 146, 'FILE' = 147, 'URL' = 148, 'REMOTE' = 149, 'MONGO' = 150, 'REDIS' = 151, 'MEILISEARCH' = 152, 'MYSQL' = 153, 'POSTGRES' = 154, 'SQLITE' = 155, 'ODBC' = 156, 'JDBC' = 157, 'HDFS' = 158, 'S3' = 159, 'HIVE' = 160, 'AZURE' = 161, 'SOURCES' = 162, 'CLUSTER' = 163, 'ALL' = 164, 'NONE' = 165))
|
`parent_group` Nullable(Enum16('SHOW DATABASES' = 0, 'SHOW TABLES' = 1, 'SHOW COLUMNS' = 2, 'SHOW DICTIONARIES' = 3, 'SHOW' = 4, 'SHOW FILESYSTEM CACHES' = 5, 'SELECT' = 6, 'INSERT' = 7, 'ALTER UPDATE' = 8, 'ALTER DELETE' = 9, 'ALTER ADD COLUMN' = 10, 'ALTER MODIFY COLUMN' = 11, 'ALTER DROP COLUMN' = 12, 'ALTER COMMENT COLUMN' = 13, 'ALTER CLEAR COLUMN' = 14, 'ALTER RENAME COLUMN' = 15, 'ALTER MATERIALIZE COLUMN' = 16, 'ALTER COLUMN' = 17, 'ALTER MODIFY COMMENT' = 18, 'ALTER ORDER BY' = 19, 'ALTER SAMPLE BY' = 20, 'ALTER ADD INDEX' = 21, 'ALTER DROP INDEX' = 22, 'ALTER MATERIALIZE INDEX' = 23, 'ALTER CLEAR INDEX' = 24, 'ALTER INDEX' = 25, 'ALTER ADD PROJECTION' = 26, 'ALTER DROP PROJECTION' = 27, 'ALTER MATERIALIZE PROJECTION' = 28, 'ALTER CLEAR PROJECTION' = 29, 'ALTER PROJECTION' = 30, 'ALTER ADD CONSTRAINT' = 31, 'ALTER DROP CONSTRAINT' = 32, 'ALTER CONSTRAINT' = 33, 'ALTER TTL' = 34, 'ALTER MATERIALIZE TTL' = 35, 'ALTER SETTINGS' = 36, 'ALTER MOVE PARTITION' = 37, 'ALTER FETCH PARTITION' = 38, 'ALTER FREEZE PARTITION' = 39, 'ALTER DATABASE SETTINGS' = 40, 'ALTER NAMED COLLECTION' = 41, 'ALTER TABLE' = 42, 'ALTER DATABASE' = 43, 'ALTER VIEW REFRESH' = 44, 'ALTER VIEW MODIFY QUERY' = 45, 'ALTER VIEW' = 46, 'ALTER' = 47, 'CREATE DATABASE' = 48, 'CREATE TABLE' = 49, 'CREATE VIEW' = 50, 'CREATE DICTIONARY' = 51, 'CREATE TEMPORARY TABLE' = 52, 'CREATE ARBITRARY TEMPORARY TABLE' = 53, 'CREATE FUNCTION' = 54, 'CREATE NAMED COLLECTION' = 55, 'CREATE' = 56, 'DROP DATABASE' = 57, 'DROP TABLE' = 58, 'DROP VIEW' = 59, 'DROP DICTIONARY' = 60, 'DROP FUNCTION' = 61, 'DROP NAMED COLLECTION' = 62, 'DROP' = 63, 'UNDROP TABLE' = 64, 'TRUNCATE' = 65, 'OPTIMIZE' = 66, 'BACKUP' = 67, 'KILL QUERY' = 68, 'KILL TRANSACTION' = 69, 'MOVE PARTITION BETWEEN SHARDS' = 70, 'CREATE USER' = 71, 'ALTER USER' = 72, 'DROP USER' = 73, 'CREATE ROLE' = 74, 'ALTER ROLE' = 75, 'DROP ROLE' = 76, 'ROLE ADMIN' = 77, 'CREATE ROW POLICY' = 78, 'ALTER ROW POLICY' = 79, 'DROP ROW POLICY' = 80, 'CREATE QUOTA' = 81, 'ALTER QUOTA' = 82, 'DROP QUOTA' = 83, 'CREATE SETTINGS PROFILE' = 84, 'ALTER SETTINGS PROFILE' = 85, 'DROP SETTINGS PROFILE' = 86, 'SHOW USERS' = 87, 'SHOW ROLES' = 88, 'SHOW ROW POLICIES' = 89, 'SHOW QUOTAS' = 90, 'SHOW SETTINGS PROFILES' = 91, 'SHOW ACCESS' = 92, 'ACCESS MANAGEMENT' = 93, 'SHOW NAMED COLLECTIONS' = 94, 'SHOW NAMED COLLECTIONS SECRETS' = 95, 'NAMED COLLECTION' = 96, 'NAMED COLLECTION ADMIN' = 97, 'SYSTEM SHUTDOWN' = 98, 'SYSTEM DROP DNS CACHE' = 99, 'SYSTEM DROP MARK CACHE' = 100, 'SYSTEM DROP UNCOMPRESSED CACHE' = 101, 'SYSTEM DROP MMAP CACHE' = 102, 'SYSTEM DROP QUERY CACHE' = 103, 'SYSTEM DROP COMPILED EXPRESSION CACHE' = 104, 'SYSTEM DROP FILESYSTEM CACHE' = 105, 'SYSTEM DROP SCHEMA CACHE' = 106, 'SYSTEM DROP S3 CLIENT CACHE' = 107, 'SYSTEM DROP CACHE' = 108, 'SYSTEM RELOAD CONFIG' = 109, 'SYSTEM RELOAD USERS' = 110, 'SYSTEM RELOAD SYMBOLS' = 111, 'SYSTEM RELOAD DICTIONARY' = 112, 'SYSTEM RELOAD MODEL' = 113, 'SYSTEM RELOAD FUNCTION' = 114, 'SYSTEM RELOAD EMBEDDED DICTIONARIES' = 115, 'SYSTEM RELOAD' = 116, 'SYSTEM RESTART DISK' = 117, 'SYSTEM MERGES' = 118, 'SYSTEM TTL MERGES' = 119, 'SYSTEM FETCHES' = 120, 'SYSTEM MOVES' = 121, 'SYSTEM DISTRIBUTED SENDS' = 122, 'SYSTEM REPLICATED SENDS' = 123, 'SYSTEM SENDS' = 124, 'SYSTEM REPLICATION QUEUES' = 125, 'SYSTEM DROP REPLICA' = 126, 'SYSTEM SYNC REPLICA' = 127, 'SYSTEM RESTART REPLICA' = 128, 'SYSTEM RESTORE REPLICA' = 129, 'SYSTEM WAIT LOADING PARTS' = 130, 'SYSTEM SYNC DATABASE REPLICA' = 131, 'SYSTEM SYNC TRANSACTION LOG' = 132, 'SYSTEM SYNC FILE CACHE' = 133, 'SYSTEM FLUSH DISTRIBUTED' = 134, 'SYSTEM FLUSH LOGS' = 135, 'SYSTEM FLUSH' = 136, 'SYSTEM THREAD FUZZER' = 137, 'SYSTEM UNFREEZE' = 138, 'SYSTEM FAILPOINT' = 139, 'SYSTEM' = 140, 'dictGet' = 141, 'displaySecretsInShowAndSelect' = 142, 'addressToLine' = 143, 'addressToLineWithInlines' = 144, 'addressToSymbol' = 145, 'demangle' = 146, 'INTROSPECTION' = 147, 'FILE' = 148, 'URL' = 149, 'REMOTE' = 150, 'MONGO' = 151, 'REDIS' = 152, 'MEILISEARCH' = 153, 'MYSQL' = 154, 'POSTGRES' = 155, 'SQLITE' = 156, 'ODBC' = 157, 'JDBC' = 158, 'HDFS' = 159, 'S3' = 160, 'HIVE' = 161, 'AZURE' = 162, 'SOURCES' = 163, 'CLUSTER' = 164, 'ALL' = 165, 'NONE' = 166))
|
||||||
)
|
)
|
||||||
ENGINE = SystemPrivileges
|
ENGINE = SystemPrivileges
|
||||||
COMMENT 'SYSTEM TABLE is built on the fly.'
|
COMMENT 'SYSTEM TABLE is built on the fly.'
|
||||||
|
@ -27,3 +27,4 @@ CREATE TABLE default.val2\n(\n `n` Int32\n) AS values(\'n int\', 1, 2)
|
|||||||
CREATE TABLE default.log\n(\n `n` Int32\n)\nENGINE = Log
|
CREATE TABLE default.log\n(\n `n` Int32\n)\nENGINE = Log
|
||||||
CREATE TABLE default.kek\n(\n `n` Int32\n)\nENGINE = Memory
|
CREATE TABLE default.kek\n(\n `n` Int32\n)\nENGINE = Memory
|
||||||
CREATE TABLE default.lol\n(\n `n` Int32\n)\nENGINE = MergeTree\nORDER BY n\nSETTINGS min_bytes_for_wide_part = 123, index_granularity = 8192
|
CREATE TABLE default.lol\n(\n `n` Int32\n)\nENGINE = MergeTree\nORDER BY n\nSETTINGS min_bytes_for_wide_part = 123, index_granularity = 8192
|
||||||
|
CREATE TEMPORARY TABLE tmp_log\n(\n `n` Int32\n)\nENGINE = Log
|
||||||
|
@ -83,8 +83,8 @@ CREATE TEMPORARY TABLE tmp (n int);
|
|||||||
SHOW CREATE TEMPORARY TABLE tmp;
|
SHOW CREATE TEMPORARY TABLE tmp;
|
||||||
CREATE TEMPORARY TABLE tmp1 (n int) ENGINE=Memory;
|
CREATE TEMPORARY TABLE tmp1 (n int) ENGINE=Memory;
|
||||||
CREATE TEMPORARY TABLE tmp2 (n int) ENGINE=Log;
|
CREATE TEMPORARY TABLE tmp2 (n int) ENGINE=Log;
|
||||||
CREATE TEMPORARY TABLE tmp2 (n int) ORDER BY n; -- {serverError 80}
|
CREATE TEMPORARY TABLE tmp2 (n int) ORDER BY n; -- {serverError 36}
|
||||||
CREATE TEMPORARY TABLE tmp2 (n int, PRIMARY KEY (n)); -- {serverError 80}
|
CREATE TEMPORARY TABLE tmp2 (n int, PRIMARY KEY (n)); -- {serverError 36}
|
||||||
|
|
||||||
CREATE TABLE log (n int);
|
CREATE TABLE log (n int);
|
||||||
SHOW CREATE log;
|
SHOW CREATE log;
|
||||||
@ -128,3 +128,7 @@ SHOW CREATE TABLE kek;
|
|||||||
SHOW CREATE TABLE lol;
|
SHOW CREATE TABLE lol;
|
||||||
DROP TABLE kek;
|
DROP TABLE kek;
|
||||||
DROP TABLE lol;
|
DROP TABLE lol;
|
||||||
|
|
||||||
|
SET default_temporary_table_engine = 'Log';
|
||||||
|
CREATE TEMPORARY TABLE tmp_log (n int);
|
||||||
|
SHOW CREATE TEMPORARY TABLE tmp_log;
|
||||||
|
Loading…
Reference in New Issue
Block a user