diff --git a/src/box/alter.cc b/src/box/alter.cc index 9cd4f59aa737ae3e36b1f4641c8eb3f7c7f80a3b..8a2586646438498109ce0221afcee66842669605 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -507,6 +507,14 @@ ModifySpace::prepare(struct alter_space *alter) (unsigned) def.id, "can not change field count on a non-empty space"); } + + EngineFactory * factory = + alter->old_space->engine->factory; + if (def.temporary && !engine_can_be_temporary(factory->id)) { + tnt_raise(ClientError, ER_ALTER_SPACE, + (unsigned) def.id, + "space does not support temporary flag"); + } if (def.temporary != alter->old_space->def.temporary && recovery->state != READY_NO_KEYS && space_size(alter->old_space) > 0) { diff --git a/src/box/engine.h b/src/box/engine.h index 26140d59e32d8143d70fc01e2d18561871a41b33..24d2ef378619ff33095ab11fcd9d0f180c2be2cd 100644 --- a/src/box/engine.h +++ b/src/box/engine.h @@ -37,6 +37,7 @@ struct tuple; enum engine_flags { ENGINE_TRANSACTIONAL = 1, ENGINE_NO_YIELD = 2, + ENGINE_CAN_BE_TEMPORARY = 4 }; extern uint32_t engine_flags[BOX_ENGINE_MAX]; @@ -189,6 +190,13 @@ engine_no_yield(uint32_t id) return engine_flags[id] & ENGINE_NO_YIELD; } +static inline bool +engine_can_be_temporary(uint32_t id) +{ + assert(id); + return engine_flags[id] & ENGINE_CAN_BE_TEMPORARY; +} + static inline uint32_t engine_id(Engine *engine) { diff --git a/src/box/engine_memtx.cc b/src/box/engine_memtx.cc index 23a74253c02656e8c6f164ca8933f1dd11c74a99..ade14477d2fffcd524741bc0e59da8828150497f 100644 --- a/src/box/engine_memtx.cc +++ b/src/box/engine_memtx.cc @@ -74,7 +74,8 @@ memtx_recovery_prepare(struct engine_recovery *r) MemtxFactory::MemtxFactory() :EngineFactory("memtx") { - flags = ENGINE_TRANSACTIONAL | ENGINE_NO_YIELD; + flags = ENGINE_TRANSACTIONAL | ENGINE_NO_YIELD | + ENGINE_CAN_BE_TEMPORARY; memtx_recovery_prepare(&recovery); } diff --git a/src/box/key_def.cc b/src/box/key_def.cc index 66f4fd4f3c9c7904625b7671edae0a91adfe27f8..42283d80aeb7268d526eb517a7e283ea9d881780 100644 --- a/src/box/key_def.cc +++ b/src/box/key_def.cc @@ -224,6 +224,14 @@ space_def_check(struct space_def *def, uint32_t namelen, uint32_t engine_namelen "space engine name is too long"); } identifier_check(def->engine_name); + + if (def->temporary) { + EngineFactory *factory = engine_find(def->engine_name); + if (! engine_can_be_temporary(factory->id)) + tnt_raise(ClientError, ER_ALTER_SPACE, + (unsigned) def->id, + "space does not support temporary flag"); + } } bool diff --git a/test/box/sophia.result b/test/box/sophia.result index 7bb5dc44aa6bcb0cc1ebe0ad804d678584dcad91..f0e70014b01224e41166fc92db64ee4fbeffe853 100644 --- a/test/box/sophia.result +++ b/test/box/sophia.result @@ -213,6 +213,39 @@ s:select{10000} s:drop() --- ... +--- +--- gh-456: Sophia: index size() is unsupported +--- +box.cfg{} +--- +... +s = box.schema.create_space('tester',{engine='sophia'}) +--- +... +s:create_index('sophia_index', {}) +--- +... +s.index[0]:len() -- exception +--- +- 4294967295 +... +box.error() +--- +- error: SophiaIndex does not support size operation +... +s:drop() +--- +... +--- +--- gh-436: No error when creating temporary sophia space +--- +box.cfg{} +--- +... +s = box.schema.create_space('tester',{engine='sophia', temporary=true}) +--- +- error: 'Can''t modify space 512: space does not support temporary flag' +... os.execute("rm -rf sophia") --- - 0 diff --git a/test/box/sophia.test.lua b/test/box/sophia.test.lua index c57ef7f913e17dd237fc3da8ecfeefbe8c08dbfa..517e8a7cb2c4c310d74c14127e16e3478af7abc1 100644 --- a/test/box/sophia.test.lua +++ b/test/box/sophia.test.lua @@ -83,4 +83,11 @@ s.index[0]:len() -- exception box.error() s:drop() +--- +--- gh-436: No error when creating temporary sophia space +--- + +box.cfg{} +s = box.schema.create_space('tester',{engine='sophia', temporary=true}) + os.execute("rm -rf sophia")