The original motivation for this commit was that shared_ptr_helper used
std::shared_ptr<>() which does two heap allocations instead of
make_shared<>() which does a single allocation. Turned out that
1. the affected code (--> Storages/) is not on a hot path (rendering the
performance argument moot ...)
2. yet copying Storage objects is potentially dangerous and was
previously allowed.
Hence, this change
- removes shared_ptr_helper and as a result all inherited create() methods,
- instead, Storage objects are now created using make_shared<>() by the
caller (for that to work, many constructors had to be made public), and
- all Storage classes were marked as noncopyable using boost::noncopyable.
In sum, we are (likely) not making things faster but the code becomes
cleaner and harder to misuse.
* clarify that cannot show create table of system's tables
* clarify that cannot show create table of system's tables in the document
* bypass test style-check for required `database=currentDatabase()` because `show create table` do not have condition
* rename supportsShowCreateTable to isSystemStorage
* build fake create query for show create table of system's tables
* fix tests for show create table on system's table:
1. only build fake create query when cannot get real query
2. only test rocksdb when it's enabled.
* fix test for show create table system.tables
* fix test for ASTCreateQuery set table and database
* change to LOGICAL_ERROR when cannot get in_memory metadata
Co-authored-by: tavplubix <tavplubix@gmail.com>
* implement common getCreateQueryFromStorage
Co-authored-by: tavplubix <tavplubix@gmail.com>
TODO (suggested by Nikolai)
1. Build query plan fro current query (inside storage::read) up to WithMergableState
2. Check, that plan is simple enough: Aggregating - Expression - Filter - ReadFromStorage (or simplier)
3. Check, that filter is the same as filter in projection, and also expression calculates the same aggregation keys as in projection
4. Return WithMergableState if projection applies
3 will be easier to do with ActionsDAG, cause it sees all functions, and dependencies are direct (but it is possible with ExpressionActions also)
Also need to figure out how prewhere works for projections, and
row_filter_policies.
wip
* "lock_acquire_timeout" controls for how long a query will continue to
acquire each lock on its argument tables
* "lock_acquire_timeout_for_background_operations" is a per-table
setting for storages of *MergeTree family