DROP PLUGIN plugin_name TYPE 'plugin_type'
Marks the specified plugin for unloading. The unloading is not immediate, because the concurrent queries might be using it. However, after a DROP
new queries will not be able to use it. Then, once all the currently executing queries using it are completed, the plugin will be unloaded. Once all the plugins from the given library are unloaded, the library is also automatically unloaded.
mysql> DROP PLUGIN myranker TYPE 'ranker';
Query OK, 0 rows affected (0.00 sec)
RELOAD PLUGINS FROM SONAME 'plugin_library'
Reloads all plugins (UDFs, rankers, etc) from a given library. Reload is, in a sense, transactional: a successful reload guarantees that:
- all the plugins were successfully updated with their new versions;
- the update was atomic, all the plugins were replaced at once. Atomicity means that queries using multiple functions from a reloaded library will never mix the old and new versions.
The set of plugins is guaranteed to always be consistent during the RELOAD
, it will be either all old, or all new.
Reload also is seamless, meaning that some version of a reloaded plugin will be available to concurrent queries at all times, and there will be no temporary disruptions. Note how this improves on using a pair of DROP
and CREATE
statements for reloading: with those, there is a tiny window between the DROP
and the subsequent CREATE
, during which the queries technically refer to an unknown plugin and will thus fail.
In case of any failure RELOAD PLUGINS
does absolutely nothing, keeps the old plugins, and reports an error.
On Windows, either overwriting or deleting a DLL library currently in use seems to be an issue. However, you can still rename it, then put a new version under the old name, and RELOAD
will then work. After a successful reload you will also be able to delete the renamed old library, too.
mysql> RELOAD PLUGINS FROM SONAME 'udfexample.dll';
Query OK, 0 rows affected (0.00 sec)
Ranker plugins let you implement a custom ranker that receives all the occurrences of the keywords matched in the document, and computes a WEIGHT()
value. They can be called as follows:
SELECT id, attr1 FROM test WHERE match('hello') OPTION ranker=myranker('option1=1');
The call workflow is as follows:
XXX_init()
gets called once per query per table, in the very beginning. A few query-wide options are passed to it through aSPH_RANKER_INIT
structure, including the user options strings (in the example just above, "option1=1" is that string).XXX_update()
gets called multiple times per matched document, with every matched keyword occurrence passed as its parameter, aSPH_RANKER_HIT
structure. The occurrences within each document are guaranteed to be passed in the order of ascendinghit->hit_pos
values.XXX_finalize()
gets called once per matched document, once there are no more keyword occurrences. It must return theWEIGHT()
value. This is the only mandatory function.XXX_deinit()
gets called once per query, in the very end.