[tarantool-patches] Re: [PATCH 2/6] sql: annotate SQL functions with return type

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Thu Sep 27 23:23:53 MSK 2018


My review fixes are on the branch in a separate
commit and here:

==========================================================================

diff --git a/src/box/lua/lua_sql.c b/src/box/lua/lua_sql.c
index e69e143db..f9e63aae6 100644
--- a/src/box/lua/lua_sql.c
+++ b/src/box/lua/lua_sql.c
@@ -130,10 +130,8 @@ int
  lbox_sql_create_function(struct lua_State *L)
  {
  	struct sqlite3 *db = sql_get();
-	if (db == NULL) {
-		luaL_error(L, "Please call box.cfg{} first");
-		return 0;
-	}
+	if (db == NULL)
+		return luaL_error(L, "Please call box.cfg{} first");
  	int argc = lua_gettop(L);
  	/*
  	 * Three function prototypes are possible:
@@ -149,53 +147,46 @@ lbox_sql_create_function(struct lua_State *L)
  	      lua_isfunction(L, 3) && lua_isnumber(L, 4)) &&
  	    !(argc == 5 && lua_isstring(L, 1) && lua_isstring(L, 2) &&
  	      lua_isfunction(L, 3) && lua_isnumber(L, 4) &&
-	      lua_isboolean(L, 5))) {
-		luaL_error(L, "Invalid arguments");
-		return 0;
-	}
+	      lua_isboolean(L, 5)))
+		return luaL_error(L, "Invalid arguments");
  	enum affinity_type type = AFFINITY_UNDEFINED;
  	const char *type_arg = lua_tostring(L, 2);
-	if (strcmp(type_arg, "INT") == 0 || strcmp(type_arg, "INTEGER") == 0) {
+	if (strcmp(type_arg, "INT") == 0 || strcmp(type_arg, "INTEGER") == 0)
  		type = AFFINITY_INTEGER;
-	} else if (strcmp(type_arg, "TEXT") == 0) {
+	else if (strcmp(type_arg, "TEXT") == 0)
  		type = AFFINITY_TEXT;
-	} else if (strcmp(type_arg, "FLOAT") == 0) {
+	else if (strcmp(type_arg, "FLOAT") == 0)
  		type = AFFINITY_REAL;
-	} else if (strcmp(type_arg, "NUM") == 0) {
+	else if (strcmp(type_arg, "NUM") == 0)
  		type = AFFINITY_NUMERIC;
-	} else if (strcmp(type_arg, "BLOB") == 0) {
+	else if (strcmp(type_arg, "BLOB") == 0)
  		type = AFFINITY_BLOB;
-	} else {
-		luaL_error(L, "Unknown type");
-	}
+	else
+		return luaL_error(L, "Unknown type");
  	/* -1 indicates any number of arguments. */
  	int func_arg_num = -1;
  	bool is_deterministic = false;
  	if (argc == 4) {
-		func_arg_num = (int) lua_tonumber(L, 4);
+		func_arg_num = lua_tointeger(L, 4);
  		lua_pop(L, 1);
  	} else if (argc == 5) {
  		is_deterministic = lua_toboolean(L, 5);
-		func_arg_num = (int) lua_tonumber(L, 4);
+		func_arg_num = lua_tointeger(L, 4);
  		lua_pop(L, 2);
  	}
-	const char *name = lua_tostring(L, 1);
-	size_t name_len = strlen(name);
+	size_t name_len;
+	const char *name = lua_tolstring(L, 1, &name_len);
  	char *normalized_name = (char *) region_alloc(&fiber()->gc,
  						      name_len + 1);
-	if (normalized_name == NULL) {
-		luaL_error(L, "out of memory");
-		return 0;
-	}
+	if (normalized_name == NULL)
+		return luaL_error(L, "out of memory");
  	memcpy(normalized_name, name, name_len);
  	normalized_name[name_len] = '\0';
  	sqlite3NormalizeName(normalized_name);
  	struct lua_sql_func_info *func_info =
  		(struct lua_sql_func_info *) malloc(sizeof(*func_info));
-	if (func_info == NULL) {
-		luaL_error(L, "out of memory");
-		return 0;
-	}
+	if (func_info == NULL)
+		return luaL_error(L, "out of memory");
  	func_info->func_ref = luaL_ref(L, LUA_REGISTRYINDEX);
  	sqlite3_create_function_v2(db, normalized_name, type, func_arg_num,
  				   is_deterministic ? SQLITE_DETERMINISTIC : 0,




More information about the Tarantool-patches mailing list