- Jul 12, 2019
-
-
Konstantin Osipov authored
A follow up on #4182
-
Kirill Shcherbatov authored
Closes #4182 Closes #4219 Needed for #1260 @TarantoolBot document Title: Persistent Lua functions Now Tarantool supports 'persistent' Lua functions. Such functions are stored in snapshot and are available after restart. To create a persistent Lua function, specify a function body in box.schema.func.create call: e.g. body = "function(a, b) return a + b end" A Lua persistent function may be 'sandboxed'. The 'sandboxed' function is executed in isolated environment: a. only limited set of Lua functions and modules are available: -assert -error -pairs -ipairs -next -pcall -xpcall -type -print -select -string -tonumber -tostring -unpack -math -utf8; b. global variables are forbidden Finally, the new 'is_deterministic' flag allows to mark a registered function as deterministic, i.e. the function that can produce only one result for a given list of parameters. The new box.schema.func.create interface is: box.schema.func.create('funcname', <setuid = true|FALSE>, <if_not_exists = true|FALSE>, <language = LUA|c>, <body = string ('')>, <is_deterministic = true|FALSE>, <is_sandboxed = true|FALSE>, <comment = string ('')>) This schema change is also reserves names for sql builtin functions: TRIM, TYPEOF, PRINTF, UNICODE, CHAR, HEX, VERSION, QUOTE, REPLACE, SUBSTR, GROUP_CONCAT, JULIANDAY, DATE, TIME, DATETIME, STRFTIME, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_DATE, LENGTH, POSITION, ROUND, UPPER, LOWER, IFNULL, RANDOM, CEIL, CEILING, CHARACTER_LENGTH, CHAR_LENGTH, FLOOR, MOD, OCTET_LENGTH, ROW_COUNT, COUNT, LIKE, ABS, EXP, LN, POWER, SQRT, SUM, TOTAL, AVG, RANDOMBLOB, NULLIF, ZEROBLOB, MIN, MAX, COALESCE, EVERY, EXISTS, EXTRACT, SOME, GREATER, LESSER, SOUNDEX, LIKELIHOOD, LIKELY, UNLIKELY, _sql_stat_get, _sql_stat_push, _sql_stat_init, LUA A new Lua persistent function LUA is introduced to evaluate LUA strings from SQL in future. This names could not be used for user-defined functions. Example: lua_code = [[function(a, b) return a + b end]] box.schema.func.create('summarize', {body = lua_code, is_deterministic = true, is_sandboxed = true}) box.func.summarize --- - aggregate: none returns: any exports: lua: true sql: false id: 60 is_sandboxed: true setuid: false is_deterministic: true body: function(a, b) return a + b end name: summarize language: LUA ... box.func.summarize:call({1, 3}) --- - 4 ... @kostja: fix style, remove unnecessary module dependencies, add comments
-
Mergen Imeev authored
Test box/net.box.test.lua checks state of the connection in case of an error. It should be 'error_reconnect'. But, in cases where testing was performed on a slow computer or in the case of a very large load, it is possible that the connection status may change from the 'error_reconnect' state to another state. This led to the failure of the test. Since this check is not the main purpose of the test, it is better to simply delete the check. Closes #4335
-
Kirill Shcherbatov authored
Moved UConverter object to collation library. This is required to get rid of sqlRegisterBuiltinFunctions function in further patches. Needed for #4113, #2200, #2233
-
Kirill Shcherbatov authored
Introduce a new flag SQL_FUNC_DERIVEDCOLL for function that may require collation to be applied on its result instead of separate boolean variable. This is required to get rid of FuncDef in further patches. Needed for #4113, #2200, #2233
-
Kirill Shcherbatov authored
Previously analyze functions refer to statically defined service FuncDef context. We need to change this approach due we going to rework the builtins functions machinery in following patches. Needed for #4113, #2200, #2233
-
- Jul 11, 2019
-
-
Kirill Shcherbatov authored
Needed for #4182 @TarantoolBot document Title: Introduce SOUNDEX sql function The SOUNDEX function returns a 4-character code that represents the sound of the words in the argument. The result can be compared to the results of the SOUNDEX function of other strings. The current SOUNDEX function supports only Latin strings. @kostja: fix test tap count; remove optional invocation; remove trailing spaces; fix alignment.
-
Cyrill Gorcunov authored
Quoting feature request | Tarantool is Database and Application Server in one box. | | Appserver development process contains a lot of | lua/luajit-ffi/lua-c-extension code. | | Coredump is very useful in case when some part of appserver crashed. | If the reason is input - data from database is not necessary. If the reason | is output - data from database is already in snap/xlog files. | | Therefore consider core dumps without data enabled by default. For info: the strip_core feature has been introduced in 549140b3 Closes #4337 @TarantoolBot document Title: Document box.cfg.strip_core When Tarantool runs under a heavy load the memory allocated for tuples may be very huge in size and to eliminate this memory from being present in `coredump` file the `box.cfg.strip_core` parameter should be set to `true`. The default value is `true`.
-
Kirill Shcherbatov authored
In relation with FuncDef cache rework we need to clean-up builtins list. The MATCH fucntion is a stub that raises an error and it could be dropped. Needed for #4182 @kostja: make the patch actually pass the tests, remove tap count change in e_expr.test.lua, since it's disabled and was not run
-
Michael Filonenko authored
-
avtikhon authored
box/net.box test flaky failed on grepping the log file for 'ER_NO_SUCH_PROC' pattern on high load running hosts, found that the issue can be resolved by updating the grep_log to wait_log function to make able to wait the needed message for some time. [008] Test failed! Result content mismatch: [008] --- box/net.box.result Tue Jul 9 17:00:24 2019 [008] +++ box/net.box.reject Tue Jul 9 17:03:34 2019 [008] @@ -1376,7 +1376,7 @@ [008] ... [008] test_run:grep_log("default", "ER_NO_SUCH_PROC") [008] --- [008] -- ER_NO_SUCH_PROC [008] +- null [008] ... [008] box.schema.user.revoke('guest', 'execute', 'universe') [008] --- Closes #4329
-
Denis Ignatenko authored
Add python-dev and pip to container to install test-run dependency Install test-run dependency from requirements.txt of test-run subrepo
-
Denis Ignatenko authored
There is compile time option PACKAGE in cmake to define current build distribution info. For community edition is it Tarantool by default. For enterprise it is Tarantool Enterprise There were no option to check distribution name in runtime. This change adds box.info.package output for CE and TE.
-
avtikhon authored
travis-ci APT repository update failed on Debian 10 (Buster) with command 'apt-get update', like: Get:1 http://deb.debian.org/debian buster InRelease [118 kB] Get:2 http://security.debian.org/debian-security buster/updates InRelease [39.1 kB] Get:3 http://deb.debian.org/debian buster-updates InRelease [46.8 kB] Reading package lists... Done N: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Version' value from '' to '10' E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'testing' to 'stable' N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details. N: Repository 'http://deb.debian.org/debian buster InRelease' changed its 'Version' value from '' to '10.0' E: Repository 'http://deb.debian.org/debian buster InRelease' changed its 'Suite' value from 'testing' to 'stable' N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details. E: Repository 'http://deb.debian.org/debian buster-updates InRelease' changed its 'Suite' value from 'testing-updates' to 'stable-updates' N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details. The cause of the issue was: According to Debian Project News published 1st of July, Debian 10 "Buster" was scheduled to transition from testing to stable on 2019-07-06. It looks like the transition was in fact performed as scheduled, and so the testing distribution should now be catching up witn unstable, to eventually become Debian 11 "Bullseye". You might be experiencing some temporary side effects because of this transition of the Debian mirrors. If you want to stay with Debian 10 "Buster", now would be a good time to switch your /etc/apt/sources.list to use the release name buster instead of testing. Otherwise, you'll soon be getting the raw bleeding-edge stuff from unstable, and you might accidentally get a partial upgrade to proto-"Bullseye". Also, this is a reminder for anyone using the word stable in their /etc/apt/sources.list to consider whether to change it to stretch and stay with the old version, or read the Release Notes and perform the recommended upgrade steps. To fix the issue it had to accept interactively the changes in the repositories NOTE: apt instead of apt-get can accept the changes interactively apt update -y either accept only the needed changes for 'version' and 'suite' apt-get update --allow-releaseinfo-change-version --allow-releaseinfo-change-suite Seems that the only 'version' and 'suite' accept is better than blind accept of the all changes. Closes #4331
-
Yaroslav Dynnikov authored
Notify socket used to be initialized during `box.cfg()`. There is no apparent reason for that, because we can write tarantool apps that don't use box api at all, but still leverage the event loop and async operations. This patch makes initialization of notify socket independent. Instance can notify entering event loop even if box.cfg wasn't called. Closes #4305
-
Kirill Shcherbatov authored
Part of #4182
-
Nikita Pettik authored
Before this patch it was impossible to compare indexed field of integer type and floating point value. For instance: CREATE TABLE t1(id INT PRIMARY KEY, a INT UNIQUE); INSERT INTO t1 VALUES (1, 1); SELECT * FROM t1 WHERE a = 1.5; --- - error: 'Failed to execute SQL statement: Supplied key type of part 0 does not match index part type: expected integer' ... That happened due to the fact that type casting mechanism (OP_ApplyType) doesn't affect FP value when it is converted to integer. Hence, FP value was passed to the iterator over integer field which resulted in error. Meanwhile, comparison of integer and FP values is legal in SQL. To cope with this problem for each equality comparison involving integer field we emit OP_MustBeInt, which checks whether value to be compared is integer or not. If the latter, we assume that result of comparison is always false and continue processing query. For inequality constraints we pass auxiliary flag to OP_Seek** opcodes to notify it that one of key fields must be truncated to integer (in case of FP value) alongside with changing iterator's type: a > 1.5 -> a >= 2. Closes #4187
-
Nikita Pettik authored
Before value to be scanned in index search is passed to the iterator, it is subjected to implicit type casting (which is implemented by OP_ApplyType). If value can't be converted to required type, user-friendly message is raised. Without this cast, type of iterator may not match with type of key which in turn results in unexpected error. However, array of types which is used to provide type conversions is different from types of indexed fields: it is modified depending on types of comparison's operands. For instance, when boolean field is compared with blob value, resulting type is assumed to be scalar. In turn, conversion to scalar is no-op. As a result, value with MP_BIN format is passed to the iterator over boolean field. To fix that let's remove this transformation of types. Moreover, it seems to be redundant. Part of #4187
-
Nikita Pettik authored
In SQL we are able to execute queries involving spaces only with formats. Otherwise, at the very beginning of query compilation error is raised. So, after that any checks of format existence are redundant.
-
Nikita Pettik authored
There are a few situations when booleans can be compared with values of other types. To process them, we assume that booleans are always less than numbers, which in turn are less than strings. On the other hand, function which implements internal comparison of values - sqlMemCompare() always returns 'less' result if one of values is boolean and another one is not, ignoring the order of values. For instance: ... max (false, 'abc') -> 'abc' ... max ('abc', false) -> false This patch fixes this misbehaviour making boolean values always less than values of other types.
-
Nikita Pettik authored
When there were no booleans in SQL, to represent them numeric values 0 and 1 were involved. However, recently booleans have been introduced in SQL, so values of result set can take boolean values. Hence, it makes no sense to continue converting booleans to numeric, so we can use directly booleans.
-
Mergen Imeev authored
This patch creates aliases CHARACTER_LENGTH() and CHAR_LENGTH() for LENGTH(). These functions are added because they are described in ANSI. Closes #3929 @TarantoolBot document Title: SQL functions CHAR_LENGTH() and CHARACTER_LENGTH() The SQL functions CHAR_LENGTH() and CHARACTER_LENGTH() work the same as the LENGTH() function. They take exactly one argument. If an argument of type TEXT or can be cast to a TEXT value using internal casting rules, these functions return the length of the TEXT value that represents the argument. They throw an error if the argument cannot be cast to a TEXT value.
-
- Jul 09, 2019
-
-
Vladislav Shpilevoy authored
Before the patch it was split in two parts by 1.5KB packet, and in the constructor it was nullifying the whole volume. Obviously, these were mistakes. The first problem breaks cache locality, the second one flushes the cache.
-
Vladislav Shpilevoy authored
Before the patch each SWIM member had two preallocated task objects, 3KB in total. It was a waste of memory, because network load per member in SWIM is ~2 messages per round step regardless of cluster size. This patch moves the tasks to a pool, where they can be reused. Even by different SWIM instances running on the same node.
-
Serge Petrenko authored
The test regarding logging corrupted rows failed occasionally with ``` [016] test_run:grep_log('default', 'Got a corrupted row.*') [016] --- [016] -- 'Got a corrupted row:' [016] +- null [016] ... ``` The logs then had ``` [010] 2019-07-06 19:36:16.857 [13046] iproto sio.c:261 !> SystemError writev(1), called on fd 23, aka unix/:(socket), peer of unix/:(socket): Broken pipe ``` instead of the expected message. This happened, because we closed a socket before tarantool could write a greeting to the client, the connection was then closed, and execution never got to processing the malformed request and thus printing the desired message to the log. To fix this, actually read the greeting prior to writing new data and closing the socket. Follow-up #4273
-
Oleg Babin authored
Closes #4323 @TarantoolBot document Title: fio.utime fio.utime (filepath [, atime [, mtime]]) Set access and modification times of a file. The first argument is the filename, the second argument (atime) is the access time, and the third argument (mtime) is the modification time. Both times are provided in seconds since the epoch. If the modification time is omitted, the access time provided is used; if both times are omitted, the current time is used.
-
Vladimir Davydov authored
When a memtx transaction is aborted on yield, it isn't enough to rollback individual statements - we must also run on_rollback triggers, otherwise changes done to the schema by an aborted DDL transaction will be visible to other fibers until an attempt to commit it is made.
-
Alexander V. Tikhonov authored
The test case has two problems that appear from time to time and lead to flaky fails. Those fails are look as shown below in a test-run output. | Test failed! Result content mismatch: | --- box/net.box.result Mon Jun 24 17:23:49 2019 | +++ box/net.box.reject Mon Jun 24 17:51:52 2019 | @@ -1404,7 +1404,7 @@ | ... | test_run:grep_log('default', 'ER_INVALID_MSGPACK.*') | --- | -- 'ER_INVALID_MSGPACK: Invalid MsgPack - packet body' | +- 'ER_INVALID_MSGPACK: Invalid MsgPack - packet length' | ... | -- gh-983 selecting a lot of data crashes the server or hangs the | -- connection 'ER_INVALID_MSGPACK.*' regexp should match 'ER_INVALID_MSGPACK: Invalid MsgPack - packet body' log message, but if it is not in a log file at a time of grep_log() call (just don't flushed to the file yet) a message produced by another test case can be matched ('ER_INVALID_MSGPACK: Invalid MsgPack - packet length'). The fix here is to match the entire message and check for the message periodically during several seconds (use wait_log() instead of grep_log()). Another problem is the race between writing a response to an iproto socket on a server side and closing the socket on a client end. If tarantool is unable to write a response, it does not produce the warning re invalid msgpack, but shows 'broken pipe' message instead. We need first grep for the message in logs and only then close the socket on a client. The similar problem (with another test case) is described in [1]. [1]: https://github.com/tarantool/tarantool/issues/4273#issuecomment-508939695 Closes: #4311
-
- Jul 08, 2019
-
-
Vladimir Davydov authored
Both commit and rollback triggers are currently added to the list head. As a result, they are both run in the reverse order. This is correct for rollback triggers, because this matches the order in which statements that added the triggers are rolled back, but this is wrong for commit triggers. For example, suppose we create a space and then create an index for it in the same transaction. We expect that on success we first run the trigger that commits the space and only then the trigger that commits the index, not vice versa. That said, reverse the order of commit triggers in the scope of preparations for transactional DDL.
-
Vladimir Davydov authored
Changes done to an altered space while a new index is being built or the format is being checked are propagated via an on_replace trigger. The problem is there may be transactions that started before the alter request. Their working set can't be checked so we simply abort them. We can't abort transactions that have reached WAL so we also call wal_sync() to flush all pending WAL requests. This is a yielding operation and we call it even if there's no transactions that need to be flushed. As a result, vinyl space alter yields unconditionally, even if the space is empty and there is no pending transactions affecting it. This prevents us from implementing transactional DDL. Let's call wal_sync() only if there's actually at least one pending transaction affecting the altered space and waiting for WAL.
-
Serge Petrenko authored
Add a decimal library to lua. Part of #692 @TarantoolBot document Title: Document decimal module in lua. First of all, you have to require the package via `decimal = require('decimal')` Now you can construct decimals via `new` method. Decimals may be constructed from lua numbers, strings, unsigned and signed 64 bit integers. Decimal is a fixed-point type with maximum 38 digits of precision. All the calculations are exact, so, be careful when constructing decimals from lua numbers: they may hold only 15 decimal digits of precision. You are advised to construct decimals from strings, since strings represent decimals exactly, and vice versa. ``` a = decimal.new(123e-7) b = decimal.new('123.456') c = decimal.new('123.456e2') d = decimal.new(123ULL) e = decimal.new(2) ``` The allowed operations are addition, subtraction, division, multiplication and power. If at least one of the operands is decimal, decimal operations are performed. The other operand may be either decimal or string, containing a number representation, or a lua number. Operations only fail on an overflow, i.e. when result exceeds 10^38 - 1. This includes division by zero. In these cases an error `Operation failed` is raised. Underflow is also possible, when precision needed to store the exact result exceeds 38 digits. Underflow is not an error. When an underflow happens, the result is rounded to 38 digits of precision. ``` a = decimal.new(123e-7) b = decimal.new('123.456') c = decimal.new('123.456e2') d = decimal.new(123ULL) e = decimal.new(2) ``` ``` tarantool> a + b --- - '123.456012300000000' ... tarantool> c - d --- - '12222.6' ... tarantool> c / b --- - '100' ... tarantool> d * d --- - '15129' ... tarantool> d ^ 2 --- - '15129' ... tarantool> 2 ^ d --- - '10633823966279326983230456482242756608'... tarantool> e ^ d --- - '10633823966279326983230456482242756608' ... ``` The following math functions are also supported: log10, ln, exp, sqrt. When specified as `decimal.opname()`, operations may be performed on strings and lua numbers. ``` f = decimal.new(100) tarantool> decimal.log10(f) --- - '2' ... tarantool> decimal.sqrt(f) --- - '10' ... tarantool> e2 = decimal.exp(2) --- ... tarantool> decimal.ln(e2) --- - '2.0000000000000000000000000000000000000' ... There are also `abs` and `tostring` methods, and an unary minus operator, which are pretty self-explanatory. ``` tarantool> a = decimal.new('-5') --- ... tarantool> a --- - '-5' ... tarantool> decimal.abs(a) --- - '5' ... tarantool> -a --- - '5' ... tostring(a) --- - '-5' ... ``` `decimal.precision`, `decimal.scale` and `decimal.round` : The first two methods return precision, i.e. decimal digits in number representation, and scale, i.e. decimal digits after the decimal point in the number representation. `decimal.round` rounds the number to the given scale. ``` tarantool> a = decimal.new('123.456789') --- ... tarantool> decimal.precision(a) --- - 9 ... tarantool> decimal.scale(a) --- - 6 ... tarantool> decimal.round(a, 4) --- - '123.4568' ... ``` Comparsions: `>`, `<`, `>=`, `<=`, `==` are also legal and work as expected. You may compare decimals with lua numbers or strings. In that case comparsion will happen after the values are converted to decimal type.
-
Serge Petrenko authored
A ffi metatype has a CTypeID, which can be used to push cdata of the type on the lua stack, and has an associated metatable, automatically applied to every created member of the type. This allows the behavior similar to pushing userdata and assigning a metatable to it. Needed for #692
-
Serge Petrenko authored
Use printf "%g" option instead of "%f" to trim traling zeros in such cases: decimal_from_double(1) -> '1.000000000000000' -> decimal_from_string() Now it should be decimal_from_double(1) -> '1' ->decimal_from_string() Follow-up 6d62c6c1
-
Serge Petrenko authored
While arithmetic operations do not return infinities or NaNs, it is possbile to construct an invalid decimal value from strings 'Infinity', 'NaN' and similar. Some decimal mathematic functions may also result in an infinity, say, ln(0) yields '-Infinity'. So, add checks that the number is not a NaN or infinity after each operation, so that the operation either returns an error, or a valid finite decimal number. Follow-up 6d62c6c1
-
Serge Petrenko authored
Turns out decNumberLn hangs when result is subnormal, according to the current context settings. To fix this, reset minimal allowed exponent to a smaller value during the ln operation and round the result afterwards. Follow-up 6d62c6c1
-
Vladimir Davydov authored
Under certain circumstances vy_slice_new() may create an empty slice, e.g. on range split: |------------------ Slice ---------------| |---- Run -----| + split key |---- Slice 1 ----||------ Slice 2 ------| ^^^^^^^ Empty vy_range_update_compaction_priority() uses the size of the last slice in a range as a base for LSM tree level sizing. If the slice size happens to be 0, it will simply hang in an infinite loop. Fix this potential hang by using 1 if the last slice size is 0.
-
Konstantin Osipov authored
-
- Jul 06, 2019
-
-
Alexander V. Tikhonov authored
Current results have some tests with flaky results, which blocks the deploy stage - decided to merge deploy stage into test stage temporary to fix it. Follows up #4156
-
- Jul 05, 2019
-
-
Vladislav Shpilevoy authored
SWIM in the original paper says, that dissemination time of an event is O(log(N)), where N is size of the cluster. It is true, when both ping and ack messages carry dissemination and anti-entropy. Before this patch it wasn't so - only regular pings were carrying something. After this patch the SWIM module has true exponential dissemination speed. Closes #4253
-
Vladislav Shpilevoy authored
One another place consuming most of the tests start up time is useless dissemination of an empty payload, which can be skipped in fact. Consider a cluster of 300 nodes. Each one of them are interconnected manually, and now a test wants to wait for a stabilization, when there are no events. On such a cluster it happens for ~200 round steps till there are no any single event. This is not about big packets, or log() TTD. There may be a few events, may be more, but when a test wants the cluster to be clean, it needs to wait for all the events being done. This patch abuses the fact, that empty payloads can be compared for free, no any single memcmp. If both new and the old payload are empty, then nothing to disseminate. It could help in a real cluster too, if initially there are no payloads. Needed for #4253
-