Tarantool development patches archive
 help / color / mirror / Atom feed
* [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas
@ 2019-12-30 16:43 imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 1/9] sql: remove PRAGMA "count_changes" imeevma
                   ` (10 more replies)
  0 siblings, 11 replies; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

This patch-set removes control pragmas.

https://github.com/tarantool/tarantool/issues/4511
https://github.com/tarantool/tarantool/tree/imeevma/gh-4511-replace-pragma-by-set

Mergen Imeev (9):
  sql: remove PRAGMA "count_changes"
  sql: remove PRAGMA "short_column_names"
  sql: remove PRAGMA "sql_compound_select_limit"
  sql: remove PRAGMA "vdbe_addoptrace"
  box: introduce 'service' engine
  box: introduce _session_settings system space
  box: add SQL settings to _session_settings
  sql: remove control pragmas
  sql: refactor PRAGMA-related code

 src/box/CMakeLists.txt                             |   2 +
 src/box/bootstrap.snap                             | Bin 5921 -> 5976 bytes
 src/box/box.cc                                     |   4 +
 src/box/errcode.h                                  |   1 +
 src/box/lua/space.cc                               |   2 +
 src/box/lua/upgrade.lua                            |  15 +
 src/box/schema_def.h                               |   8 +
 src/box/service_engine.c                           | 135 ++++++
 src/box/service_engine.h                           |  53 +++
 src/box/session_settings.c                         | 472 +++++++++++++++++++++
 src/box/session_settings.h                         |  70 +++
 src/box/sql.c                                      |   8 +-
 src/box/sql/build.c                                | 194 +++++++++
 src/box/sql/delete.c                               |  24 --
 src/box/sql/expr.c                                 |  15 -
 src/box/sql/insert.c                               |  34 +-
 src/box/sql/parse.y                                |  34 +-
 src/box/sql/pragma.c                               | 447 +++++--------------
 src/box/sql/pragma.h                               | 253 ++---------
 src/box/sql/select.c                               |  20 +-
 src/box/sql/sqlInt.h                               |  25 +-
 src/box/sql/update.c                               |  25 --
 src/box/sql/util.c                                 |  15 -
 src/box/sql/vdbe.c                                 |  33 +-
 src/box/sql/vdbe.h                                 |   5 -
 src/box/sql/vdbeaux.c                              |  39 +-
 test/app-tap/tarantoolctl.test.lua                 |   4 +-
 test/box-py/bootstrap.result                       |   3 +
 test/box/access_sysview.result                     |   6 +-
 test/box/alter.result                              |   5 +-
 ...h-4511-access-settings-from-any-frontend.result | 286 +++++++++++++
 ...4511-access-settings-from-any-frontend.test.lua | 108 +++++
 test/box/misc.result                               |   1 +
 test/box/sql-update-with-nested-select.result      |   2 -
 test/box/sql-update-with-nested-select.test.lua    |   3 -
 test/sql-tap/autoinc.test.lua                      |   3 +-
 test/sql-tap/colname.test.lua                      |  51 +--
 test/sql-tap/fkey2.test.lua                        |   4 +-
 test/sql-tap/index-info.test.lua                   |   2 +-
 test/sql-tap/lua/sqltester.lua                     |   2 +-
 test/sql-tap/misc1.test.lua                        |   2 +-
 test/sql-tap/pragma.test.lua                       | 135 +-----
 test/sql-tap/select1.test.lua                      |  55 +--
 test/sql-tap/suite.ini                             |   1 +
 test/sql-tap/tkt3731.test.lua                      |   2 +-
 test/sql-tap/trigger2.test.lua                     |   3 +-
 test/sql-tap/triggerC.test.lua                     |  65 +--
 test/sql-tap/update.test.lua                       |  49 ++-
 test/sql-tap/whereA.test.lua                       |  24 +-
 test/sql/check-clear-ephemeral.result              |   5 +-
 test/sql/check-clear-ephemeral.test.lua            |   5 +-
 test/sql/checks.result                             |  10 +-
 test/sql/checks.test.lua                           |   4 +-
 test/sql/clear.result                              |   5 +-
 test/sql/clear.test.lua                            |   5 +-
 test/sql/collation.result                          |   3 +-
 test/sql/collation.test.lua                        |   2 +-
 test/sql/constraint.result                         |   3 +-
 test/sql/constraint.test.lua                       |   2 +-
 test/sql/ddl.result                                |   3 +-
 test/sql/ddl.test.lua                              |   2 +-
 test/sql/delete-multiple-idx.result                |   5 +-
 test/sql/delete-multiple-idx.test.lua              |   5 +-
 test/sql/delete.result                             |   5 +-
 test/sql/delete.test.lua                           |   5 +-
 test/sql/drop-index.result                         |   5 +-
 test/sql/drop-index.test.lua                       |   5 +-
 test/sql/drop-table.result                         |   5 +-
 test/sql/drop-table.test.lua                       |   5 +-
 test/sql/engine.cfg                                |   3 -
 test/sql/engine.result                             |  12 +-
 test/sql/engine.test.lua                           |   6 +-
 test/sql/errinj.result                             |   3 +-
 test/sql/errinj.test.lua                           |   2 +-
 test/sql/full_metadata.result                      |   8 +-
 test/sql/full_metadata.test.lua                    |   4 +-
 test/sql/func-recreate.result                      |   3 +-
 test/sql/func-recreate.test.lua                    |   2 +-
 test/sql/gh-2362-select-access-rights.result       |   5 +-
 test/sql/gh-2362-select-access-rights.test.lua     |   2 +-
 test/sql/gh-2929-primary-key.result                |   3 +-
 test/sql/gh-2929-primary-key.test.lua              |   2 +-
 test/sql/gh-2981-check-autoinc.result              |   3 +-
 test/sql/gh-2981-check-autoinc.test.lua            |   2 +-
 test/sql/gh-3199-no-mem-leaks.result               |   3 +-
 test/sql/gh-3199-no-mem-leaks.test.lua             |   2 +-
 test/sql/gh-3613-idx-alter-update-2.result         |   3 +-
 test/sql/gh-3613-idx-alter-update-2.test.lua       |   2 +-
 test/sql/gh-3613-idx-alter-update.result           |   3 +-
 test/sql/gh-3613-idx-alter-update.test.lua         |   2 +-
 test/sql/gh-3888-values-blob-assert.result         |   3 +-
 test/sql/gh-3888-values-blob-assert.test.lua       |   2 +-
 test/sql/gh2141-delete-trigger-drop-table.result   |   3 +-
 test/sql/gh2141-delete-trigger-drop-table.test.lua |   2 +-
 test/sql/gh2251-multiple-update.result             |   3 +-
 test/sql/gh2251-multiple-update.test.lua           |   2 +-
 test/sql/gh2483-remote-persistency-check.result    |   3 +-
 test/sql/gh2483-remote-persistency-check.test.lua  |   2 +-
 .../gh2808-inline-unique-persistency-check.result  |   3 +-
 ...gh2808-inline-unique-persistency-check.test.lua |   2 +-
 test/sql/icu-upper-lower.result                    |   3 +-
 test/sql/icu-upper-lower.test.lua                  |   2 +-
 test/sql/insert-unique.result                      |   5 +-
 test/sql/insert-unique.test.lua                    |   5 +-
 test/sql/integer-overflow.result                   |   3 +-
 test/sql/integer-overflow.test.lua                 |   2 +-
 test/sql/iproto.result                             |  34 +-
 test/sql/iproto.test.lua                           |  10 +-
 test/sql/max-on-index.result                       |   5 +-
 test/sql/max-on-index.test.lua                     |   5 +-
 test/sql/message-func-indexes.result               |   3 +-
 test/sql/message-func-indexes.test.lua             |   2 +-
 test/sql/misc.result                               |   3 +-
 test/sql/misc.test.lua                             |   2 +-
 test/sql/no-pk-space.result                        |   3 +-
 test/sql/no-pk-space.test.lua                      |   2 +-
 test/sql/on-conflict.result                        |   3 +-
 test/sql/on-conflict.test.lua                      |   2 +-
 test/sql/persistency.result                        |   3 +-
 test/sql/persistency.test.lua                      |   2 +-
 test/sql/row-count.result                          |  11 +-
 test/sql/row-count.test.lua                        |   4 +-
 test/sql/savepoints.result                         |   3 +-
 test/sql/savepoints.test.lua                       |   2 +-
 test/sql/select-null.result                        |   5 +-
 test/sql/select-null.test.lua                      |   5 +-
 test/sql/sql-debug.result                          |  57 ---
 test/sql/sql-debug.test.lua                        |  17 -
 test/sql/sql-statN-index-drop.test.lua             |   2 +-
 test/sql/suite.ini                                 |   2 +-
 test/sql/tokenizer.result                          |   3 +-
 test/sql/tokenizer.test.lua                        |   2 +-
 test/sql/transition.result                         |   3 +-
 test/sql/transition.test.lua                       |   2 +-
 test/sql/transitive-transactions.result            |   9 +-
 test/sql/transitive-transactions.test.lua          |   9 +-
 test/sql/triggers.result                           |  27 +-
 test/sql/triggers.test.lua                         |  14 +-
 test/sql/update-with-nested-select.result          |   5 +-
 test/sql/update-with-nested-select.test.lua        |   5 +-
 test/sql/upgrade.result                            |   3 +-
 test/sql/upgrade.test.lua                          |   2 +-
 test/sql/view.result                               |   3 +-
 test/sql/view.test.lua                             |   2 +-
 test/sql/view_delayed_wal.result                   |   3 +-
 test/sql/view_delayed_wal.test.lua                 |   2 +-
 test/sql/vinyl-opts.result                         |   4 +-
 test/sql/vinyl-opts.test.lua                       |   2 +-
 test/wal_off/alter.result                          |   2 +-
 149 files changed, 1775 insertions(+), 1472 deletions(-)
 create mode 100644 src/box/service_engine.c
 create mode 100644 src/box/service_engine.h
 create mode 100644 src/box/session_settings.c
 create mode 100644 src/box/session_settings.h
 create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.result
 create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.test.lua
 delete mode 100644 test/sql/sql-debug.result
 delete mode 100644 test/sql/sql-debug.test.lua

-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 1/9] sql: remove PRAGMA "count_changes"
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 2/9] sql: remove PRAGMA "short_column_names" imeevma
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

Pragma "count_changes" forces the INSERT, REPLACE, DELETE, and
UPDATE statements to return the number of changed rows as a
result set. This is not necessary, as these statements return the
number of changed rows as metadata.

Part of #4511
---
 src/box/sql/delete.c         |  24 ----------
 src/box/sql/insert.c         |  34 +------------
 src/box/sql/pragma.h         | 110 ++++++++++++++++++++-----------------------
 src/box/sql/sqlInt.h         |   3 --
 src/box/sql/update.c         |  25 ----------
 src/box/sql/vdbe.c           |  29 +-----------
 test/sql-tap/update.test.lua |  49 ++++++++++---------
 test/sql/iproto.result       |  31 ------------
 test/sql/iproto.test.lua     |   8 ----
 test/sql/sql-debug.result    |   1 -
 10 files changed, 77 insertions(+), 237 deletions(-)

diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c
index 169814a..8d9ae4f 100644
--- a/src/box/sql/delete.c
+++ b/src/box/sql/delete.c
@@ -191,15 +191,6 @@ sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list,
 				     tab_cursor);
 	}
 
-	/* Initialize the counter of the number of rows deleted,
-	 * if we are counting rows.
-	 */
-	int reg_count = -1;
-	uint32_t sql_flags = parse->sql_flags;
-	if ((sql_flags & SQL_CountRows) != 0) {
-		reg_count = ++parse->nMem;
-		sqlVdbeAddOp2(v, OP_Integer, 0, reg_count);
-	}
 	/* Special case: A DELETE without a WHERE clause deletes
 	 * everything. It is easier just to erase the whole table.
 	 */
@@ -284,12 +275,6 @@ sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list,
 		 */
 		/* assert(is_complex || one_pass != ONEPASS_OFF); */
 
-		/* Keep track of the number of rows to be
-		 * deleted.
-		 */
-		if ((sql_flags & SQL_CountRows) != 0)
-			sqlVdbeAddOp2(v, OP_AddImm, reg_count, 1);
-
 		/* Extract the primary key for the current row */
 		if (!is_view) {
 			struct key_part_def *part = pk_info->parts;
@@ -413,15 +398,6 @@ sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list,
 		}
 	}
 
-	/* Return the number of rows that were deleted. */
-	if ((sql_flags & SQL_CountRows) != 0 &&
-	    parse->triggered_space != NULL) {
-		sqlVdbeAddOp2(v, OP_ResultRow, reg_count, 1);
-		sqlVdbeSetNumCols(v, 1);
-		vdbe_metadata_set_col_name(v, 0, "rows deleted");
-		vdbe_metadata_set_col_type(v, 0, "integer");
-	}
-
  delete_from_cleanup:
 	sqlSrcListDelete(db, tab_list);
 	sql_expr_delete(db, where, false);
diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c
index f1290e0..43a0de5 100644
--- a/src/box/sql/insert.c
+++ b/src/box/sql/insert.c
@@ -251,7 +251,6 @@ sqlInsert(Parse * pParse,	/* Parser context */
 
 	/* Register allocations */
 	int regFromSelect = 0;	/* Base register for data coming from SELECT */
-	int regRowCount = 0;	/* Memory cell used for the row counter */
 	int regIns;		/* Block of regs holding data being inserted */
 	int regTupleid;		/* registers holding insert tupleid */
 	int regData;		/* register holding first column to insert */
@@ -334,7 +333,7 @@ sqlInsert(Parse * pParse,	/* Parser context */
 	    xferOptimization(pParse, space, pSelect, on_error)) {
 		assert(trigger == NULL);
 		assert(pList == 0);
-		goto insert_end;
+		goto insert_cleanup;
 	}
 
 	/*
@@ -512,12 +511,6 @@ sqlInsert(Parse * pParse,	/* Parser context */
 		goto insert_cleanup;
 	}
 
-	/* Initialize the count of rows to be inserted
-	 */
-	if ((pParse->sql_flags & SQL_CountRows) != 0) {
-		regRowCount = ++pParse->nMem;
-		sqlVdbeAddOp2(v, OP_Integer, 0, regRowCount);
-	}
 	/* This is the top of the main insertion loop */
 	if (useTempTable) {
 		/* This block codes the top of loop only.  The complete loop is the
@@ -745,12 +738,6 @@ sqlInsert(Parse * pParse,	/* Parser context */
 					       on_error, autoinc_reg);
 	}
 
-	/* Update the count of rows that are inserted
-	 */
-	if ((pParse->sql_flags & SQL_CountRows) != 0) {
-		sqlVdbeAddOp2(v, OP_AddImm, regRowCount, 1);
-	}
-
 	if (trigger != NULL) {
 		/* Code AFTER triggers */
 		vdbe_code_row_trigger(pParse, trigger, TK_INSERT, 0,
@@ -773,22 +760,6 @@ sqlInsert(Parse * pParse,	/* Parser context */
 		sqlVdbeJumpHere(v, addrInsTop);
 	}
 
- insert_end:
-
-	/* Return the number of rows inserted. */
-	if ((pParse->sql_flags & SQL_CountRows) != 0 &&
-	    pParse->triggered_space == NULL) {
-		sqlVdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
-		sqlVdbeSetNumCols(v, 1);
-		const char *column_name;
-		if (on_error == ON_CONFLICT_ACTION_REPLACE)
-			column_name = "rows replaced";
-		else
-			column_name = "rows inserted";
-		vdbe_metadata_set_col_name(v, 0, column_name);
-		vdbe_metadata_set_col_type(v, 0, "integer");
-	}
-
  insert_cleanup:
 	sqlSrcListDelete(db, pTabList);
 	sql_expr_list_delete(db, pList);
@@ -1181,9 +1152,6 @@ xferOptimization(Parse * pParse,	/* Parser context */
 	 */
 	if (!rlist_empty(&dest->child_fk_constraint))
 		return 0;
-	if ((pParse->sql_flags & SQL_CountRows) != 0) {
-		return 0;	/* xfer opt does not play well with PRAGMA count_changes */
-	}
 
 	/* If we get this far, it means that the xfer optimization is at
 	 * least a possibility, though it might only work if the destination
diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h
index aa9377a..d122a13 100644
--- a/src/box/sql/pragma.h
+++ b/src/box/sql/pragma.h
@@ -93,60 +93,57 @@ static const char *const pragCName[] = {
 	/*  55 */ "text",
 	/*  56 */ "match",
 	/*  57 */ "text",
-	/* Used by: count_changes */
-	/*  58 */ "count_changes",
-	/*  59 */ "integer",
 	/* Used by: defer_foreign_keys */
-	/*  60 */ "defer_foreign_keys",
-	/*  61 */ "integer",
+	/*  58 */ "defer_foreign_keys",
+	/*  59 */ "integer",
 	/* Used by: full_column_names */
-	/*  62 */ "full_column_names",
-	/*  63 */ "integer",
+	/*  60 */ "full_column_names",
+	/*  61 */ "integer",
 	/* Used by: parser_trace */
-	/*  64 */ "parser_trace",
-	/*  65 */ "integer",
+	/*  62 */ "parser_trace",
+	/*  63 */ "integer",
 	/* Used by: recursive_triggers */
-	/*  66 */ "recursive_triggers",
-	/*  67 */ "integer",
+	/*  64 */ "recursive_triggers",
+	/*  65 */ "integer",
 	/* Used by: reverse_unordered_selects */
-	/*  68 */ "reverse_unordered_selects",
-	/*  69 */ "integer",
+	/*  66 */ "reverse_unordered_selects",
+	/*  67 */ "integer",
 	/* Used by: select_trace */
-	/*  70 */ "select_trace",
-	/*  71 */ "integer",
+	/*  68 */ "select_trace",
+	/*  69 */ "integer",
 	/* Used by: short_column_names */
-	/*  72 */ "short_column_names",
-	/*  73 */ "integer",
+	/*  70 */ "short_column_names",
+	/*  71 */ "integer",
 	/* Used by: sql_compound_select_limit */
-	/*  74 */ "sql_compound_select_limit",
-	/*  75 */ "integer",
+	/*  72 */ "sql_compound_select_limit",
+	/*  73 */ "integer",
 	/* Used by: sql_default_engine */
-	/*  76 */ "sql_default_engine",
-	/*  77 */ "text",
+	/*  74 */ "sql_default_engine",
+	/*  75 */ "text",
 	/* Used by: sql_trace */
-	/*  78 */ "sql_trace",
-	/*  79 */ "integer",
+	/*  76 */ "sql_trace",
+	/*  77 */ "integer",
 	/* Used by: vdbe_addoptrace */
-	/*  80 */ "vdbe_addoptrace",
-	/*  81 */ "integer",
+	/*  78 */ "vdbe_addoptrace",
+	/*  79 */ "integer",
 	/* Used by: vdbe_debug */
-	/*  82 */ "vdbe_debug",
-	/*  83 */ "integer",
+	/*  80 */ "vdbe_debug",
+	/*  81 */ "integer",
 	/* Used by: vdbe_eqp */
-	/*  84 */ "vdbe_eqp",
-	/*  85 */ "integer",
+	/*  82 */ "vdbe_eqp",
+	/*  83 */ "integer",
 	/* Used by: vdbe_listing */
-	/*  86 */ "vdbe_listing",
-	/*  87 */ "integer",
+	/*  84 */ "vdbe_listing",
+	/*  85 */ "integer",
 	/* Used by: vdbe_trace */
-	/*  88 */ "vdbe_trace",
-	/*  89 */ "integer",
+	/*  86 */ "vdbe_trace",
+	/*  87 */ "integer",
 	/* Used by: where_trace */
-	/*  90 */ "where_trace",
-	/*  91 */ "integer",
+	/*  88 */ "where_trace",
+	/*  89 */ "integer",
 	/* Used by: full_metadata */
-	/*  92 */ "full_metadata",
-	/*  93 */ "integer",
+	/*  90 */ "full_metadata",
+	/*  91 */ "integer",
 };
 
 /* Definitions of all built-in pragmas */
@@ -168,15 +165,10 @@ static const PragmaName aPragmaName[] = {
 	 /* ePragFlg:  */ PragFlg_Result0,
 	 /* ColNames:  */ 38, 2,
 	 /* iArg:      */ 0},
-	{ /* zName:     */ "count_changes",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 60, 1,
-	 /* iArg:      */ SQL_CountRows},
 	{ /* zName:     */ "defer_foreign_keys",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 62, 1,
+	 /* ColNames:  */ 58, 1,
 	 /* iArg:      */ SQL_DeferFKs},
 	{ /* zName:     */ "foreign_key_list",
 	 /* ePragTyp:  */ PragTyp_FOREIGN_KEY_LIST,
@@ -187,12 +179,12 @@ static const PragmaName aPragmaName[] = {
 	{ /* zName:     */ "full_column_names",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 64, 1,
+	 /* ColNames:  */ 60, 1,
 	 /* iArg:      */ SQL_FullColNames},
 	{ /* zName:     */ "full_metadata",
 	  /* ePragTyp:  */ PragTyp_FLAG,
 	  /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	  /* ColNames:  */ 92, 1,
+	  /* ColNames:  */ 90, 1,
 	  /* iArg:      */ SQL_FullMetadata},
 	{ /* zName:     */ "index_info",
 	 /* ePragTyp:  */ PragTyp_INDEX_INFO,
@@ -210,46 +202,46 @@ static const PragmaName aPragmaName[] = {
 	{ /* zName:     */ "parser_trace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 64, 1,
+	 /* ColNames:  */ 62, 1,
 	 /* iArg:      */ PARSER_TRACE_FLAG},
 #endif
 	{ /* zName:     */ "recursive_triggers",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 66, 1,
+	 /* ColNames:  */ 64, 1,
 	 /* iArg:      */ SQL_RecTriggers},
 	{ /* zName:     */ "reverse_unordered_selects",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 68, 1,
+	 /* ColNames:  */ 66, 1,
 	 /* iArg:      */ SQL_ReverseOrder},
 #if defined(SQL_DEBUG)
 	{ /* zName:     */ "select_trace",
 	/* ePragTyp:  */ PragTyp_FLAG,
 	/* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	/* ColNames:  */ 70, 1,
+	/* ColNames:  */ 68, 1,
 	/* iArg:      */ SQL_SelectTrace},
 #endif
 	{ /* zName:     */ "short_column_names",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 72, 1,
+	 /* ColNames:  */ 70, 1,
 	 /* iArg:      */ SQL_ShortColNames},
 	{ /* zName:     */ "sql_compound_select_limit",
 	/* ePragTyp:  */ PragTyp_COMPOUND_SELECT_LIMIT,
 	/* ePragFlg:  */ PragFlg_Result0,
-	/* ColNames:  */ 74, 1,
+	/* ColNames:  */ 72, 1,
 	/* iArg:      */ 0},
 	{ /* zName:     */ "sql_default_engine",
 	 /* ePragTyp:  */ PragTyp_DEFAULT_ENGINE,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 76, 1,
+	 /* ColNames:  */ 74, 1,
 	 /* iArg:      */ 0},
 #if defined(SQL_DEBUG)
 	{ /* zName:     */ "sql_trace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 78, 1,
+	 /* ColNames:  */ 76, 1,
 	 /* iArg:      */ SQL_SqlTrace},
 #endif
 	{ /* zName:     */ "stats",
@@ -268,33 +260,33 @@ static const PragmaName aPragmaName[] = {
 	{ /* zName:     */ "vdbe_addoptrace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 80, 1,
+	 /* ColNames:  */ 78, 1,
 	 /* iArg:      */ SQL_VdbeAddopTrace},
 	{ /* zName:     */ "vdbe_debug",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 82, 1,
+	 /* ColNames:  */ 80, 1,
 	 /* iArg:      */
 	 SQL_SqlTrace | SQL_VdbeListing | SQL_VdbeTrace},
 	{ /* zName:     */ "vdbe_eqp",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 84, 1,
+	 /* ColNames:  */ 82, 1,
 	 /* iArg:      */ SQL_VdbeEQP},
 	{ /* zName:     */ "vdbe_listing",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 86, 1,
+	 /* ColNames:  */ 84, 1,
 	 /* iArg:      */ SQL_VdbeListing},
 	{ /* zName:     */ "vdbe_trace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 88, 1,
+	 /* ColNames:  */ 86, 1,
 	 /* iArg:      */ SQL_VdbeTrace},
 	{ /* zName:     */ "where_trace",
 	/* ePragTyp:  */ PragTyp_FLAG,
 	/* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	/* ColNames:  */ 90, 1,
+	/* ColNames:  */ 88, 1,
 	/* iArg:      */ SQL_WhereTrace},
 #endif
 };
diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h
index 2d2aee6..4678eff 100644
--- a/src/box/sql/sqlInt.h
+++ b/src/box/sql/sqlInt.h
@@ -1191,9 +1191,6 @@ struct sql {
 #define PARSER_TRACE_FLAG  0x00000002
 #define SQL_FullColNames   0x00000004	/* Show full column names on SELECT */
 #define SQL_ShortColNames  0x00000040	/* Show short columns names */
-#define SQL_CountRows      0x00000080	/* Count rows changed by INSERT, */
-					  /*   DELETE, or UPDATE and return */
-					  /*   the count using a callback. */
 #define SQL_SqlTrace       0x00000200	/* Debug print SQL as it executes */
 #define SQL_SelectTrace    0x00000800       /* Debug info about select statement */
 #define SQL_WhereTrace     0x00008000       /* Debug info about optimizer's work */
diff --git a/src/box/sql/update.c b/src/box/sql/update.c
index c08777a..d25262c 100644
--- a/src/box/sql/update.c
+++ b/src/box/sql/update.c
@@ -76,7 +76,6 @@ sqlUpdate(Parse * pParse,		/* The parser context */
 	int aiCurOnePass[2];	/* The write cursors opened by WHERE_ONEPASS */
 
 	/* Register Allocations */
-	int regRowCount = 0;	/* A count of rows changed */
 	int regOldPk = 0;
 	int regNewPk = 0;
 	int regNew = 0;		/* Content of the NEW.* table in triggers */
@@ -268,14 +267,6 @@ sqlUpdate(Parse * pParse,		/* The parser context */
 	 */
 	sqlWhereEnd(pWInfo);
 
-
-	/* Initialize the count of updated rows
-	 */
-	if ((pParse->sql_flags & SQL_CountRows) != 0 &&
-	    pParse->triggered_space == NULL) {
-		regRowCount = ++pParse->nMem;
-		sqlVdbeAddOp2(v, OP_Integer, 0, regRowCount);
-	}
 	labelBreak = sqlVdbeMakeLabel(v);
 	/* Top of the update loop */
 	if (okOnePass) {
@@ -470,13 +461,6 @@ sqlUpdate(Parse * pParse,		/* The parser context */
 			fk_constraint_emit_actions(pParse, space, regOldPk, aXRef);
 	}
 
-	/* Increment the row counter
-	 */
-	if ((pParse->sql_flags & SQL_CountRows) != 0 &&
-	     pParse->triggered_space == NULL) {
-		sqlVdbeAddOp2(v, OP_AddImm, regRowCount, 1);
-	}
-
 	vdbe_code_row_trigger(pParse, trigger, TK_UPDATE, pChanges,
 			      TRIGGER_AFTER, space, regOldPk, on_error,
 			      labelContinue);
@@ -493,15 +477,6 @@ sqlUpdate(Parse * pParse,		/* The parser context */
 	}
 	sqlVdbeResolveLabel(v, labelBreak);
 
-	/* Return the number of rows that were changed. */
-	if ((pParse->sql_flags & SQL_CountRows) != 0 &&
-	    pParse->triggered_space == NULL) {
-		sqlVdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
-		sqlVdbeSetNumCols(v, 1);
-		vdbe_metadata_set_col_name(v, 0, "rows updated");
-		vdbe_metadata_set_col_type(v, 0, "integer");
-	}
-
  update_cleanup:
 	sqlSrcListDelete(db, pTabList);
 	sql_expr_list_delete(db, pChanges);
diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
index ca99e8e..b821d9d 100644
--- a/src/box/sql/vdbe.c
+++ b/src/box/sql/vdbe.c
@@ -1418,34 +1418,7 @@ case OP_ResultRow: {
 	assert(p->nResColumn==pOp->p2);
 	assert(pOp->p1>0);
 	assert(pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1);
-
-	/* If this statement has violated immediate foreign key constraints, do
-	 * not return the number of rows modified. And do not RELEASE the statement
-	 * transaction. It needs to be rolled back.
-	 */
-	if (sqlVdbeCheckFk(p, 0) != 0) {
-		assert((p->sql_flags & SQL_CountRows) != 0);
-		goto abort_due_to_error;
-	}
-
-	/* If the SQL_CountRows flag is set in sql.flags mask, then
-	 * DML statements invoke this opcode to return the number of rows
-	 * modified to the user. This is the only way that a VM that
-	 * opens a statement transaction may invoke this opcode.
-	 *
-	 * In case this is such a statement, close any statement transaction
-	 * opened by this VM before returning control to the user. This is to
-	 * ensure that statement-transactions are always nested, not overlapping.
-	 * If the open statement-transaction is not closed here, then the user
-	 * may step another VM that opens its own statement transaction. This
-	 * may lead to overlapping statement transactions.
-	 *
-	 * The statement transaction is never a top-level transaction.  Hence
-	 * the RELEASE call below can never fail.
-	 */
-	assert(p->iStatement == 0 || (p->sql_flags & SQL_CountRows) != 0);
-	rc = sqlVdbeCloseStatement(p, SAVEPOINT_RELEASE);
-	assert(rc==0);
+	assert(p->iStatement == 0 && p->anonymous_savepoint == NULL);
 
 	/* Invalidate all ephemeral cursor row caches */
 	p->cacheCtr = (p->cacheCtr + 2)|1;
diff --git a/test/sql-tap/update.test.lua b/test/sql-tap/update.test.lua
index 07e4e43..ac0389a 100755
--- a/test/sql-tap/update.test.lua
+++ b/test/sql-tap/update.test.lua
@@ -21,6 +21,11 @@ test:plan(111)
 -- ["source",[["testdir"],"\/tester.tcl"]]
 -- Try to update an non-existent table
 --
+
+local function update_row_count(sql)
+    return box.execute(sql).row_count
+end
+
 test:do_catchsql_test("update-1.1", [[
   UPDATE test1 SET f2=5 WHERE f1<1
 ]], {
@@ -124,13 +129,12 @@ test:do_execsql_test("update-3.6", [[
 })
 
 test:do_test("update-3.7", function()
-  test:execsql "PRAGMA count_changes=on"
-  return test:execsql "UPDATE test1 SET f2=f2/3 WHERE f1<=5"
-end, {
+    return update_row_count("UPDATE test1 SET f2 = f2 / 3 WHERE f1 <= 5")
+  end,
   -- <update-3.7>
   5
   -- </update-3.7>
-})
+)
 
 test:do_execsql_test("update-3.8", [[
   SELECT f1,f2 FROM test1 ORDER BY f1
@@ -140,13 +144,13 @@ test:do_execsql_test("update-3.8", [[
   -- </update-3.8>
 })
 
-test:do_execsql_test("update-3.9", [[
-  UPDATE test1 SET f2=f2/3 WHERE f1>5
-]], {
+test:do_test("update-3.9", function()
+    return update_row_count("UPDATE test1 SET f2 = f2 / 3 WHERE f1 > 5")
+  end,
   -- <update-3.9>
   5
   -- </update-3.9>
-})
+)
 
 test:do_execsql_test("update-3.10", [[
   SELECT f1,f2 FROM test1 ORDER BY f1
@@ -158,13 +162,13 @@ test:do_execsql_test("update-3.10", [[
 
 -- Swap the values of f1 and f2 for all elements
 --
-test:do_execsql_test("update-3.11", [[
-  UPDATE test1 SET F2=f1, F1=f2
-]], {
+test:do_test("update-3.11", function()
+    return update_row_count("UPDATE test1 SET F2 = f1, F1 = f2")
+  end,
   -- <update-3.11>
   10
   -- </update-3.11>
-})
+)
 
 test:do_execsql_test("update-3.12", [[
   SELECT f1,f2 FROM test1 ORDER BY F1
@@ -175,7 +179,6 @@ test:do_execsql_test("update-3.12", [[
 })
 
 test:do_test("update-3.13", function()
-  test:execsql "PRAGMA count_changes=off"
   return test:execsql "UPDATE test1 SET F2=f1, F1=f2"
 end, {
   -- <update-3.13>
@@ -254,17 +257,15 @@ end, {
   -- </update-4.5>
 })
 
-test:do_execsql_test("update-4.6", [[
-  PRAGMA count_changes=on;
-  UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128;
-]], {
+test:do_test("update-4.6", function()
+    return update_row_count("UPDATE test1 SET f1 = f1 - 1 WHERE f1 <= 100 and f2 == 128;")
+  end,
   -- <update-4.6>
   2
   -- </update-4.6>
-})
+)
 
 test:do_execsql_test("update-4.7", [[
-  PRAGMA count_changes=off;
   SELECT f1,f2 FROM test1 ORDER BY f1,f2
 ]], {
   -- <update-4.7>
@@ -391,17 +392,15 @@ test:do_execsql_test("update-5.5.5", [[
   -- </update-5.5.5>
 })
 
-test:do_execsql_test("update-5.6", [[
-  PRAGMA count_changes=on;
-  UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128;
-]], {
+test:do_test("update-5.6", function()
+    return update_row_count("UPDATE test1 SET f1 = f1 - 1 WHERE f1 <= 100 and f2 == 128;")
+  end,
   -- <update-5.6>
   2
   -- </update-5.6>
-})
+)
 
 test:do_execsql_test("update-5.6.1", [[
-  PRAGMA count_changes=off;
   SELECT f1,f2 FROM test1 ORDER BY f1,f2
 ]], {
   -- <update-5.6.1>
diff --git a/test/sql/iproto.result b/test/sql/iproto.result
index 99dc58b..3240c2b 100644
--- a/test/sql/iproto.result
+++ b/test/sql/iproto.result
@@ -732,37 +732,6 @@ res.metadata
   - name: detail
     type: text
 ...
--- When pragma count_changes is on, statements INSERT, REPLACE and
--- UPDATE returns number of changed columns. Make sure that this
--- result has a column type.
-cn:execute("PRAGMA count_changes = 1;")
----
-- row_count: 0
-...
-cn:execute("INSERT INTO t1 VALUES (1), (2), (3);")
----
-- metadata:
-  - name: rows inserted
-    type: integer
-  rows:
-  - [3]
-...
-cn:execute("REPLACE INTO t1 VALUES (2), (3), (4), (5);")
----
-- metadata:
-  - name: rows replaced
-    type: integer
-  rows:
-  - [4]
-...
-cn:execute("UPDATE t1 SET id = id + 100 WHERE id > 10;")
----
-- metadata:
-  - name: rows updated
-    type: integer
-  rows:
-  - [0]
-...
 -- Make sure that built-in functions have a right returning type.
 --
 cn:execute("SELECT zeroblob(1);")
diff --git a/test/sql/iproto.test.lua b/test/sql/iproto.test.lua
index 5dfe95c..b5ec2c0 100644
--- a/test/sql/iproto.test.lua
+++ b/test/sql/iproto.test.lua
@@ -220,14 +220,6 @@ res.metadata
 res = cn:execute("EXPLAIN QUERY PLAN SELECT COUNT(*) FROM t1")
 res.metadata
 
--- When pragma count_changes is on, statements INSERT, REPLACE and
--- UPDATE returns number of changed columns. Make sure that this
--- result has a column type.
-cn:execute("PRAGMA count_changes = 1;")
-cn:execute("INSERT INTO t1 VALUES (1), (2), (3);")
-cn:execute("REPLACE INTO t1 VALUES (2), (3), (4), (5);")
-cn:execute("UPDATE t1 SET id = id + 100 WHERE id > 10;")
-
 -- Make sure that built-in functions have a right returning type.
 --
 cn:execute("SELECT zeroblob(1);")
diff --git a/test/sql/sql-debug.result b/test/sql/sql-debug.result
index a1b9766..cb59768 100644
--- a/test/sql/sql-debug.result
+++ b/test/sql/sql-debug.result
@@ -38,7 +38,6 @@ box.execute('PRAGMA')
   - name: pragma_value
     type: integer
   rows:
-  - ['count_changes', 0]
   - ['defer_foreign_keys', 0]
   - ['full_column_names', 0]
   - ['full_metadata', 0]
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 2/9] sql: remove PRAGMA "short_column_names"
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 1/9] sql: remove PRAGMA "count_changes" imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 23:12   ` Nikita Pettik
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 3/9] sql: remove PRAGMA "sql_compound_select_limit" imeevma
                   ` (8 subsequent siblings)
  10 siblings, 1 reply; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

The pragmas "short_column_names" and "full_column_names" allow us
to use three ways to display the column name in metadata:
1) If both are turned off, then the column name was shown as it
was written by the user.
2) If "short_column_names" = OFF and "full_column_names" = ON,
then the column name is displayed as <table name>.<column name>.
3) If "short_column_names" = ON, then the column name is displayed
as <column name>. This is the default option.

But we need only two ways to show the column name:
1) Show the column name as <column name>. This should be the
default option.
2) Show the column name as <table name>.<column name>.

In this regard, we need only one of these pragmas.

Part of #4511
---
 src/box/sql.c                 |  3 +-
 src/box/sql/pragma.h          | 68 +++++++++++++++++++------------------------
 src/box/sql/select.c          | 20 +++++--------
 src/box/sql/sqlInt.h          |  1 -
 test/sql-tap/colname.test.lua | 37 +++++++----------------
 test/sql-tap/select1.test.lua | 13 ++-------
 test/sql/sql-debug.result     |  1 -
 7 files changed, 52 insertions(+), 91 deletions(-)

diff --git a/src/box/sql.c b/src/box/sql.c
index f1df555..7c1035c 100644
--- a/src/box/sql.c
+++ b/src/box/sql.c
@@ -59,8 +59,7 @@ static sql *db = NULL;
 
 static const char nil_key[] = { 0x90 }; /* Empty MsgPack array. */
 
-static const uint32_t default_sql_flags = SQL_ShortColNames
-					  | SQL_EnableTrigger
+static const uint32_t default_sql_flags = SQL_EnableTrigger
 					  | SQL_AutoIndex
 					  | SQL_RecTriggers;
 
diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h
index d122a13..cf235a0 100644
--- a/src/box/sql/pragma.h
+++ b/src/box/sql/pragma.h
@@ -111,39 +111,36 @@ static const char *const pragCName[] = {
 	/* Used by: select_trace */
 	/*  68 */ "select_trace",
 	/*  69 */ "integer",
-	/* Used by: short_column_names */
-	/*  70 */ "short_column_names",
-	/*  71 */ "integer",
 	/* Used by: sql_compound_select_limit */
-	/*  72 */ "sql_compound_select_limit",
-	/*  73 */ "integer",
+	/*  70 */ "sql_compound_select_limit",
+	/*  71 */ "integer",
 	/* Used by: sql_default_engine */
-	/*  74 */ "sql_default_engine",
-	/*  75 */ "text",
+	/*  72 */ "sql_default_engine",
+	/*  73 */ "text",
 	/* Used by: sql_trace */
-	/*  76 */ "sql_trace",
-	/*  77 */ "integer",
+	/*  74 */ "sql_trace",
+	/*  75 */ "integer",
 	/* Used by: vdbe_addoptrace */
-	/*  78 */ "vdbe_addoptrace",
-	/*  79 */ "integer",
+	/*  76 */ "vdbe_addoptrace",
+	/*  77 */ "integer",
 	/* Used by: vdbe_debug */
-	/*  80 */ "vdbe_debug",
-	/*  81 */ "integer",
+	/*  78 */ "vdbe_debug",
+	/*  79 */ "integer",
 	/* Used by: vdbe_eqp */
-	/*  82 */ "vdbe_eqp",
-	/*  83 */ "integer",
+	/*  80 */ "vdbe_eqp",
+	/*  81 */ "integer",
 	/* Used by: vdbe_listing */
-	/*  84 */ "vdbe_listing",
-	/*  85 */ "integer",
+	/*  82 */ "vdbe_listing",
+	/*  83 */ "integer",
 	/* Used by: vdbe_trace */
-	/*  86 */ "vdbe_trace",
-	/*  87 */ "integer",
+	/*  84 */ "vdbe_trace",
+	/*  85 */ "integer",
 	/* Used by: where_trace */
-	/*  88 */ "where_trace",
-	/*  89 */ "integer",
+	/*  86 */ "where_trace",
+	/*  87 */ "integer",
 	/* Used by: full_metadata */
-	/*  90 */ "full_metadata",
-	/*  91 */ "integer",
+	/*  88 */ "full_metadata",
+	/*  89 */ "integer",
 };
 
 /* Definitions of all built-in pragmas */
@@ -184,7 +181,7 @@ static const PragmaName aPragmaName[] = {
 	{ /* zName:     */ "full_metadata",
 	  /* ePragTyp:  */ PragTyp_FLAG,
 	  /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	  /* ColNames:  */ 90, 1,
+	  /* ColNames:  */ 88, 1,
 	  /* iArg:      */ SQL_FullMetadata},
 	{ /* zName:     */ "index_info",
 	 /* ePragTyp:  */ PragTyp_INDEX_INFO,
@@ -222,26 +219,21 @@ static const PragmaName aPragmaName[] = {
 	/* ColNames:  */ 68, 1,
 	/* iArg:      */ SQL_SelectTrace},
 #endif
-	{ /* zName:     */ "short_column_names",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 70, 1,
-	 /* iArg:      */ SQL_ShortColNames},
 	{ /* zName:     */ "sql_compound_select_limit",
 	/* ePragTyp:  */ PragTyp_COMPOUND_SELECT_LIMIT,
 	/* ePragFlg:  */ PragFlg_Result0,
-	/* ColNames:  */ 72, 1,
+	/* ColNames:  */ 70, 1,
 	/* iArg:      */ 0},
 	{ /* zName:     */ "sql_default_engine",
 	 /* ePragTyp:  */ PragTyp_DEFAULT_ENGINE,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 74, 1,
+	 /* ColNames:  */ 72, 1,
 	 /* iArg:      */ 0},
 #if defined(SQL_DEBUG)
 	{ /* zName:     */ "sql_trace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 76, 1,
+	 /* ColNames:  */ 74, 1,
 	 /* iArg:      */ SQL_SqlTrace},
 #endif
 	{ /* zName:     */ "stats",
@@ -260,33 +252,33 @@ static const PragmaName aPragmaName[] = {
 	{ /* zName:     */ "vdbe_addoptrace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 78, 1,
+	 /* ColNames:  */ 76, 1,
 	 /* iArg:      */ SQL_VdbeAddopTrace},
 	{ /* zName:     */ "vdbe_debug",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 80, 1,
+	 /* ColNames:  */ 78, 1,
 	 /* iArg:      */
 	 SQL_SqlTrace | SQL_VdbeListing | SQL_VdbeTrace},
 	{ /* zName:     */ "vdbe_eqp",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 82, 1,
+	 /* ColNames:  */ 80, 1,
 	 /* iArg:      */ SQL_VdbeEQP},
 	{ /* zName:     */ "vdbe_listing",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 84, 1,
+	 /* ColNames:  */ 82, 1,
 	 /* iArg:      */ SQL_VdbeListing},
 	{ /* zName:     */ "vdbe_trace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 86, 1,
+	 /* ColNames:  */ 84, 1,
 	 /* iArg:      */ SQL_VdbeTrace},
 	{ /* zName:     */ "where_trace",
 	/* ePragTyp:  */ PragTyp_FLAG,
 	/* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	/* ColNames:  */ 88, 1,
+	/* ColNames:  */ 86, 1,
 	/* iArg:      */ SQL_WhereTrace},
 #endif
 };
diff --git a/src/box/sql/select.c b/src/box/sql/select.c
index 5dd8cd5..0fc86e5 100644
--- a/src/box/sql/select.c
+++ b/src/box/sql/select.c
@@ -1763,7 +1763,6 @@ generate_column_metadata(struct Parse *pParse, struct SrcList *pTabList,
 	Vdbe *v = pParse->pVdbe;
 	int i, j;
 	sql *db = pParse->db;
-	int fullNames, shortNames;
 	/* If this is an EXPLAIN, skip this step */
 	if (pParse->explain) {
 		return;
@@ -1781,8 +1780,6 @@ generate_column_metadata(struct Parse *pParse, struct SrcList *pTabList,
 	}
 	assert(pTabList != 0);
 	pParse->colNamesSet = 1;
-	fullNames = (pParse->sql_flags & SQL_FullColNames) != 0;
-	shortNames = (pParse->sql_flags & SQL_ShortColNames) != 0;
 	bool is_full_meta = (pParse->sql_flags & SQL_FullMetadata) != 0;
 	sqlVdbeSetNumCols(v, pEList->nExpr);
 	uint32_t var_count = 0;
@@ -1828,11 +1825,12 @@ generate_column_metadata(struct Parse *pParse, struct SrcList *pTabList,
 			struct space_def *space_def = space->def;
 			assert(iCol >= 0 && iCol < (int)space_def->field_count);
 			zCol = space_def->fields[iCol].name;
-			const char *name = colname;
-			if (name == NULL) {
-				if (!shortNames && !fullNames) {
-					name = span;
-				} else if (fullNames) {
+			const char *name = NULL;
+			if (pEList->a[i].zName != NULL) {
+				name = pEList->a[i].zName;
+			} else {
+				int flags = pParse->sql_flags;
+				if ((flags & SQL_FullColNames) != 0) {
 					name = tt_sprintf("%s.%s",
 							  space_def->name,
 							  zCol);
@@ -2057,8 +2055,7 @@ sqlResultSetOfSelect(Parse * pParse, Select * pSelect)
 	sql *db = pParse->db;
 
 	uint32_t saved_flags = pParse->sql_flags;
-	pParse->sql_flags |= ~SQL_FullColNames;
-	pParse->sql_flags &= SQL_ShortColNames;
+	pParse->sql_flags = 0;
 	sqlSelectPrep(pParse, pSelect, 0);
 	if (pParse->is_aborted)
 		return NULL;
@@ -4962,8 +4959,7 @@ selectExpander(Walker * pWalker, Select * p)
 		struct ExprList_item *a = pEList->a;
 		ExprList *pNew = 0;
 		uint32_t flags = pParse->sql_flags;
-		int longNames = (flags & SQL_FullColNames) != 0
-		    && (flags & SQL_ShortColNames) == 0;
+		int longNames = (flags & SQL_FullColNames) != 0;
 
 		for (k = 0; k < pEList->nExpr; k++) {
 			pE = a[k].pExpr;
diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h
index 4678eff..d1d1a11 100644
--- a/src/box/sql/sqlInt.h
+++ b/src/box/sql/sqlInt.h
@@ -1190,7 +1190,6 @@ struct sql {
 /* Debug print info about SQL query as it parsed */
 #define PARSER_TRACE_FLAG  0x00000002
 #define SQL_FullColNames   0x00000004	/* Show full column names on SELECT */
-#define SQL_ShortColNames  0x00000040	/* Show short columns names */
 #define SQL_SqlTrace       0x00000200	/* Debug print SQL as it executes */
 #define SQL_SelectTrace    0x00000800       /* Debug info about select statement */
 #define SQL_WhereTrace     0x00008000       /* Debug info about optimizer's work */
diff --git a/test/sql-tap/colname.test.lua b/test/sql-tap/colname.test.lua
index 253497c..de03d7c 100755
--- a/test/sql-tap/colname.test.lua
+++ b/test/sql-tap/colname.test.lua
@@ -1,6 +1,6 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
-test:plan(63)
+test:plan(62)
 
 --!./tcltestrunner.lua
 -- 2008 July 15
@@ -28,16 +28,12 @@ test:plan(63)
 -- (2) A non-trival expression (not a table column name) then the name is
 --     a copy of the expression text.
 --
--- (3) If short_column_names=ON, then just the abbreviated column name without
+-- (3) If full_column_names=OFF, then just the abbreviated column name without
 --     the table name.
 --
--- (4) When short_column_names=OFF and full_column_names=OFF then
---     use case (2) for simple queries and case (5) for joins.
+-- (4) When full_column_names=ON then use the form: TABLE.COLUMN
 --
--- (5) When short_column_names=OFF and full_column_names=ON then
---     use the form: TABLE.COLUMN
---
--- Verify the default settings for short_column_name and full_column_name
+-- Verify the default settings for full_column_name
 --
 local function lreplace(arr, pos, len, val)
     for i = pos + 1, pos + len + 1, 1 do
@@ -49,16 +45,6 @@ end
 test:do_test(
     "colname-1.1",
     function()
-        return test:execsql "PRAGMA short_column_names"
-    end, {
-        -- <colname-1.1>
-        1
-        -- </colname-1.1>
-    })
-
-test:do_test(
-    "colname-1.2",
-    function()
         return test:execsql "PRAGMA full_column_names"
     end, {
         -- <colname-1.2>
@@ -172,12 +158,11 @@ test:do_execsql2_test(
         -- </colname-2.9>
     })
 
--- Tests for short=OFF and full=OFF
+-- Tests for full=OFF
 test:do_test(
     "colname-3.1",
     function()
         test:execsql [[
-            PRAGMA short_column_names='OFF';
             PRAGMA full_column_names='OFF';
             CREATE VIEW v3 AS SELECT tabC.a, txyZ.x, *
               FROM tabc, txyz ORDER BY 1 LIMIT 1;
@@ -199,7 +184,7 @@ test:do_execsql2_test(
         SELECT Tabc.a, tAbc.b, taBc.c FROM tabc
     ]], {
         -- <colname-3.2>
-        "Tabc.a", 1, "tAbc.b", 2, "taBc.c", 3
+        "A", 1, "B", 2, "C", 3
         -- </colname-3.2>
     })
 
@@ -209,7 +194,7 @@ test:do_execsql2_test(
         SELECT +tabc.a, -tabc.b, tabc.c FROM tabc
     ]], {
         -- <colname-3.3>
-        "+tabc.a", 1, "-tabc.b", -2, "tabc.c", 3
+        "+tabc.a", 1, "-tabc.b", -2, "C", 3
         -- </colname-3.3>
     })
 
@@ -229,7 +214,7 @@ test:do_execsql2_test(
         SELECT Tabc.a, Txyz.x, * FROM tabc, txyz;
     ]], {
         -- <colname-3.5>
-        "Tabc.a", 1, "Txyz.x", 4, "A", 1, "B", 2, "C", 3, "X", 4, "Y", 5, "Z", 6
+        "A", 1, "X", 4, "A", 1, "B", 2, "C", 3, "X", 4, "Y", 5, "Z", 6
         -- </colname-3.5>
     })
 
@@ -259,7 +244,7 @@ test:do_execsql2_test(
         SELECT v1.a, * FROM v1 ORDER BY 2;
     ]], {
         -- <colname-3.8>
-        "v1.a",1,"A",1,"X",4,"A_1",1,"B",2,"C",3,"X_1",4,"Y",5,"Z",6
+        "A",1,"A",1,"X",4,"A_1",1,"B",2,"C",3,"X_1",4,"Y",5,"Z",6
         -- </colname-3.8>
     })
 
@@ -293,12 +278,11 @@ test:do_execsql2_test(
         -- </colname-3.11>
     })
 
--- Test for short=OFF and full=ON
+-- Test for full=ON
 test:do_test(
     "colname-4.1",
     function()
         test:execsql [[
-            PRAGMA short_column_names='OFF';
             PRAGMA full_column_names='ON';
             CREATE VIEW v5 AS SELECT tabC.a, txyZ.x, *
               FROM tabc, txyz ORDER BY 1 LIMIT 1;
@@ -456,7 +440,6 @@ test:do_test(
         -- instead of reconnect to database
         -- we are just turning settings to default state
         test:execsql([[
-            PRAGMA short_column_names='ON';
             PRAGMA full_column_names='OFF';
             ]])
         test:execsql [=[
diff --git a/test/sql-tap/select1.test.lua b/test/sql-tap/select1.test.lua
index 13b5390..7029d27 100755
--- a/test/sql-tap/select1.test.lua
+++ b/test/sql-tap/select1.test.lua
@@ -940,7 +940,7 @@ test:do_catchsql2_test(
         SELECT * FROM test1 WHERE f1==11
     ]], {
         -- <select1-6.1.3>
-        0, {"F1", 11, "F2", 22}
+        0, {"TEST1.F1", 11, "TEST1.F2", 22}
         -- </select1-6.1.3>
     })
 
@@ -956,7 +956,7 @@ test:do_test(
         return table.insert(v,msg) or v
     end, {
         -- <select1-6.1.4>
-        0, {"F1", 11, "F2", 22}
+        0, {"TEST1.F1", 11, "TEST1.F2", 22}
         -- </select1-6.1.4>
     })
 
@@ -1124,7 +1124,6 @@ test:do_test(
     "select1-6.9.3",
     function()
         test:execsql [[
-            PRAGMA short_column_names='OFF';
             PRAGMA full_column_names='OFF';
         ]]
         return test:execsql2 [[
@@ -1132,7 +1131,7 @@ test:do_test(
         ]]
     end, {
         -- <select1-6.9.3>
-        "test1 . f1", 11, "test1 . f2", 22
+        "F1", 11, "F2", 22
         -- </select1-6.9.3>
     })
 
@@ -1140,7 +1139,6 @@ test:do_test(
     "select1-6.9.4",
     function()
         test:execsql [[
-            PRAGMA short_column_names='OFF';
             PRAGMA full_column_names='ON';
         ]]
         return test:execsql2 [[
@@ -1156,7 +1154,6 @@ test:do_test(
     "select1-6.9.5",
     function()
         test:execsql [[
-            PRAGMA short_column_names='OFF';
             PRAGMA full_column_names='ON';
         ]]
         return test:execsql2 [[
@@ -1238,7 +1235,6 @@ test:do_test(
     "select1-6.9.11",
     function()
         test:execsql [[
-            PRAGMA short_column_names='ON';
             PRAGMA full_column_names='ON';
         ]]
         return test:execsql2 [[
@@ -1264,7 +1260,6 @@ test:do_test(
     "select1-6.9.13",
     function()
         test:execsql [[
-            PRAGMA short_column_names='ON';
             PRAGMA full_column_names='OFF';
         ]]
         return test:execsql2 [[
@@ -1290,7 +1285,6 @@ test:do_test(
     "select1-6.9.15",
     function()
         test:execsql [[
-            PRAGMA short_column_names='OFF';
             PRAGMA full_column_names='ON';
         ]]
         return test:execsql2 [[
@@ -1313,7 +1307,6 @@ test:do_execsql2_test(
     })
 
 test:execsql [[
-    PRAGMA short_column_names='ON';
     PRAGMA full_column_names='OFF';
 ]]
 test:do_catchsql2_test(
diff --git a/test/sql/sql-debug.result b/test/sql/sql-debug.result
index cb59768..ce87f11 100644
--- a/test/sql/sql-debug.result
+++ b/test/sql/sql-debug.result
@@ -45,7 +45,6 @@ box.execute('PRAGMA')
   - ['recursive_triggers', 1]
   - ['reverse_unordered_selects', 0]
   - ['select_trace', 0]
-  - ['short_column_names', 1]
   - ['sql_trace', 0]
   - ['vdbe_addoptrace', 0]
   - ['vdbe_debug', 0]
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 3/9] sql: remove PRAGMA "sql_compound_select_limit"
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 1/9] sql: remove PRAGMA "count_changes" imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 2/9] sql: remove PRAGMA "short_column_names" imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 23:11   ` Nikita Pettik
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 4/9] sql: remove PRAGMA "vdbe_addoptrace" imeevma
                   ` (7 subsequent siblings)
  10 siblings, 1 reply; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

Pragma sql_compound_select_limit was added in commit b2afe208
("sql: decrease SELECT_COMPOUND_LIMIT threshold"). However, there
is no need to make this parameter mutable. We also plan to rework
SELECT (#3700), so this limit will be removed in future.

Part of #4511
---
 src/box/sql/pragma.c   | 11 ---------
 src/box/sql/pragma.h   | 63 ++++++++++++++++++++++----------------------------
 test/sql-tap/suite.ini |  1 +
 3 files changed, 28 insertions(+), 47 deletions(-)

diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
index 00ecde0..a8353ba 100644
--- a/src/box/sql/pragma.c
+++ b/src/box/sql/pragma.c
@@ -586,17 +586,6 @@ sqlPragma(Parse * pParse, Token * pId,	/* First part of [schema.]id field */
 		break;
 	}
 
-	case PragTyp_COMPOUND_SELECT_LIMIT: {
-		if (zRight != NULL) {
-			sql_limit(db, SQL_LIMIT_COMPOUND_SELECT,
-				      sqlAtoi(zRight));
-		}
-		int retval =
-			sql_limit(db, SQL_LIMIT_COMPOUND_SELECT, -1);
-		returnSingleInt(v, retval);
-		break;
-	}
-
 	default:
 		unreachable();
 	}			/* End of the PRAGMA switch */
diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h
index cf235a0..6c9aa8d 100644
--- a/src/box/sql/pragma.h
+++ b/src/box/sql/pragma.h
@@ -13,7 +13,6 @@
 #define PragTyp_STATS                         15
 #define PragTyp_TABLE_INFO                    17
 #define PragTyp_DEFAULT_ENGINE                25
-#define PragTyp_COMPOUND_SELECT_LIMIT         26
 
 /* Property flags associated with various pragma. */
 #define PragFlg_NeedSchema 0x01	/* Force schema load before running */
@@ -111,36 +110,33 @@ static const char *const pragCName[] = {
 	/* Used by: select_trace */
 	/*  68 */ "select_trace",
 	/*  69 */ "integer",
-	/* Used by: sql_compound_select_limit */
-	/*  70 */ "sql_compound_select_limit",
-	/*  71 */ "integer",
 	/* Used by: sql_default_engine */
-	/*  72 */ "sql_default_engine",
-	/*  73 */ "text",
+	/*  70 */ "sql_default_engine",
+	/*  71 */ "text",
 	/* Used by: sql_trace */
-	/*  74 */ "sql_trace",
-	/*  75 */ "integer",
+	/*  72 */ "sql_trace",
+	/*  73 */ "integer",
 	/* Used by: vdbe_addoptrace */
-	/*  76 */ "vdbe_addoptrace",
-	/*  77 */ "integer",
+	/*  74 */ "vdbe_addoptrace",
+	/*  75 */ "integer",
 	/* Used by: vdbe_debug */
-	/*  78 */ "vdbe_debug",
-	/*  79 */ "integer",
+	/*  76 */ "vdbe_debug",
+	/*  77 */ "integer",
 	/* Used by: vdbe_eqp */
-	/*  80 */ "vdbe_eqp",
-	/*  81 */ "integer",
+	/*  78 */ "vdbe_eqp",
+	/*  79 */ "integer",
 	/* Used by: vdbe_listing */
-	/*  82 */ "vdbe_listing",
-	/*  83 */ "integer",
+	/*  80 */ "vdbe_listing",
+	/*  81 */ "integer",
 	/* Used by: vdbe_trace */
-	/*  84 */ "vdbe_trace",
-	/*  85 */ "integer",
+	/*  82 */ "vdbe_trace",
+	/*  83 */ "integer",
 	/* Used by: where_trace */
-	/*  86 */ "where_trace",
-	/*  87 */ "integer",
+	/*  84 */ "where_trace",
+	/*  85 */ "integer",
 	/* Used by: full_metadata */
-	/*  88 */ "full_metadata",
-	/*  89 */ "integer",
+	/*  86 */ "full_metadata",
+	/*  87 */ "integer",
 };
 
 /* Definitions of all built-in pragmas */
@@ -181,7 +177,7 @@ static const PragmaName aPragmaName[] = {
 	{ /* zName:     */ "full_metadata",
 	  /* ePragTyp:  */ PragTyp_FLAG,
 	  /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	  /* ColNames:  */ 88, 1,
+	  /* ColNames:  */ 86, 1,
 	  /* iArg:      */ SQL_FullMetadata},
 	{ /* zName:     */ "index_info",
 	 /* ePragTyp:  */ PragTyp_INDEX_INFO,
@@ -219,21 +215,16 @@ static const PragmaName aPragmaName[] = {
 	/* ColNames:  */ 68, 1,
 	/* iArg:      */ SQL_SelectTrace},
 #endif
-	{ /* zName:     */ "sql_compound_select_limit",
-	/* ePragTyp:  */ PragTyp_COMPOUND_SELECT_LIMIT,
-	/* ePragFlg:  */ PragFlg_Result0,
-	/* ColNames:  */ 70, 1,
-	/* iArg:      */ 0},
 	{ /* zName:     */ "sql_default_engine",
 	 /* ePragTyp:  */ PragTyp_DEFAULT_ENGINE,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 72, 1,
+	 /* ColNames:  */ 70, 1,
 	 /* iArg:      */ 0},
 #if defined(SQL_DEBUG)
 	{ /* zName:     */ "sql_trace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 74, 1,
+	 /* ColNames:  */ 72, 1,
 	 /* iArg:      */ SQL_SqlTrace},
 #endif
 	{ /* zName:     */ "stats",
@@ -252,33 +243,33 @@ static const PragmaName aPragmaName[] = {
 	{ /* zName:     */ "vdbe_addoptrace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 76, 1,
+	 /* ColNames:  */ 74, 1,
 	 /* iArg:      */ SQL_VdbeAddopTrace},
 	{ /* zName:     */ "vdbe_debug",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 78, 1,
+	 /* ColNames:  */ 76, 1,
 	 /* iArg:      */
 	 SQL_SqlTrace | SQL_VdbeListing | SQL_VdbeTrace},
 	{ /* zName:     */ "vdbe_eqp",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 80, 1,
+	 /* ColNames:  */ 78, 1,
 	 /* iArg:      */ SQL_VdbeEQP},
 	{ /* zName:     */ "vdbe_listing",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 82, 1,
+	 /* ColNames:  */ 80, 1,
 	 /* iArg:      */ SQL_VdbeListing},
 	{ /* zName:     */ "vdbe_trace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 84, 1,
+	 /* ColNames:  */ 82, 1,
 	 /* iArg:      */ SQL_VdbeTrace},
 	{ /* zName:     */ "where_trace",
 	/* ePragTyp:  */ PragTyp_FLAG,
 	/* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	/* ColNames:  */ 86, 1,
+	/* ColNames:  */ 84, 1,
 	/* iArg:      */ SQL_WhereTrace},
 #endif
 };
diff --git a/test/sql-tap/suite.ini b/test/sql-tap/suite.ini
index 8f3c3ea..2e8411d 100644
--- a/test/sql-tap/suite.ini
+++ b/test/sql-tap/suite.ini
@@ -21,6 +21,7 @@ disabled = selectA.test.lua ;
            analyzeE.test.lua ;
            analyzeF.test.lua ;
            gh-3350-skip-scan.test.lua ;
+           gh2548-select-compound-limit.test.lua ;
 
 lua_libs = lua/sqltester.lua ../sql/lua/sql_tokenizer.lua ../box/lua/identifier.lua
 is_parallel = True
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 4/9] sql: remove PRAGMA "vdbe_addoptrace"
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
                   ` (2 preceding siblings ...)
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 3/9] sql: remove PRAGMA "sql_compound_select_limit" imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 5/9] box: introduce 'service' engine imeevma
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

The vdbe_addoptrace pragma provides a convenient way to track the
insertion of opcodes into VDBE during VDBE creation. This patch
makes it impossible to disable this feature in the debug build by
removing the pragma. So, now you do not need to enable pragma in
order to use this feature.

Part of #4511
---
 src/box/sql/expr.c        | 15 ---------------
 src/box/sql/pragma.h      | 44 ++++++++++++++++++--------------------------
 src/box/sql/sqlInt.h      |  1 -
 src/box/sql/vdbeaux.c     | 21 ++++-----------------
 test/sql/sql-debug.result |  1 -
 5 files changed, 22 insertions(+), 60 deletions(-)

diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c
index f76f822..6380894 100644
--- a/src/box/sql/expr.c
+++ b/src/box/sql/expr.c
@@ -3466,11 +3466,6 @@ sqlExprCachePush(Parse * pParse)
 {
 	struct session MAYBE_UNUSED *user_session;
 	pParse->iCacheLevel++;
-#ifdef SQL_DEBUG
-	if ((pParse->sql_flags & SQL_VdbeAddopTrace) != 0) {
-		printf("PUSH to %d\n", pParse->iCacheLevel);
-	}
-#endif
 }
 
 /*
@@ -3486,11 +3481,6 @@ sqlExprCachePop(Parse * pParse)
 	user_session = current_session();
 	assert(pParse->iCacheLevel >= 1);
 	pParse->iCacheLevel--;
-#ifdef SQL_DEBUG
-	if ((pParse->sql_flags & SQL_VdbeAddopTrace) != 0) {
-		printf("POP  to %d\n", pParse->iCacheLevel);
-	}
-#endif
 	while (i < pParse->nColCache) {
 		if (pParse->aColCache[i].iLevel > pParse->iCacheLevel) {
 			cacheEntryClear(pParse, i);
@@ -3562,11 +3552,6 @@ sqlExprCacheClear(Parse * pParse)
 	struct session MAYBE_UNUSED *user_session;
 	user_session = current_session();
 
-#if SQL_DEBUG
-	if ((pParse->sql_flags & SQL_VdbeAddopTrace) != 0) {
-		printf("CLEAR\n");
-	}
-#endif
 	for (i = 0; i < pParse->nColCache; i++) {
 		if (pParse->aColCache[i].tempReg
 		    && pParse->nTempReg < ArraySize(pParse->aTempReg)
diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h
index 6c9aa8d..05c913d 100644
--- a/src/box/sql/pragma.h
+++ b/src/box/sql/pragma.h
@@ -116,27 +116,24 @@ static const char *const pragCName[] = {
 	/* Used by: sql_trace */
 	/*  72 */ "sql_trace",
 	/*  73 */ "integer",
-	/* Used by: vdbe_addoptrace */
-	/*  74 */ "vdbe_addoptrace",
-	/*  75 */ "integer",
 	/* Used by: vdbe_debug */
-	/*  76 */ "vdbe_debug",
-	/*  77 */ "integer",
+	/*  74 */ "vdbe_debug",
+	/*  75 */ "integer",
 	/* Used by: vdbe_eqp */
-	/*  78 */ "vdbe_eqp",
-	/*  79 */ "integer",
+	/*  76 */ "vdbe_eqp",
+	/*  77 */ "integer",
 	/* Used by: vdbe_listing */
-	/*  80 */ "vdbe_listing",
-	/*  81 */ "integer",
+	/*  78 */ "vdbe_listing",
+	/*  79 */ "integer",
 	/* Used by: vdbe_trace */
-	/*  82 */ "vdbe_trace",
-	/*  83 */ "integer",
+	/*  80 */ "vdbe_trace",
+	/*  81 */ "integer",
 	/* Used by: where_trace */
-	/*  84 */ "where_trace",
-	/*  85 */ "integer",
+	/*  82 */ "where_trace",
+	/*  83 */ "integer",
 	/* Used by: full_metadata */
-	/*  86 */ "full_metadata",
-	/*  87 */ "integer",
+	/*  84 */ "full_metadata",
+	/*  85 */ "integer",
 };
 
 /* Definitions of all built-in pragmas */
@@ -177,7 +174,7 @@ static const PragmaName aPragmaName[] = {
 	{ /* zName:     */ "full_metadata",
 	  /* ePragTyp:  */ PragTyp_FLAG,
 	  /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	  /* ColNames:  */ 86, 1,
+	  /* ColNames:  */ 84, 1,
 	  /* iArg:      */ SQL_FullMetadata},
 	{ /* zName:     */ "index_info",
 	 /* ePragTyp:  */ PragTyp_INDEX_INFO,
@@ -240,36 +237,31 @@ static const PragmaName aPragmaName[] = {
 	 /* ColNames:  */ 0, 6,
 	 /* iArg:      */ 0},
 #if defined(SQL_DEBUG)
-	{ /* zName:     */ "vdbe_addoptrace",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 74, 1,
-	 /* iArg:      */ SQL_VdbeAddopTrace},
 	{ /* zName:     */ "vdbe_debug",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 76, 1,
+	 /* ColNames:  */ 74, 1,
 	 /* iArg:      */
 	 SQL_SqlTrace | SQL_VdbeListing | SQL_VdbeTrace},
 	{ /* zName:     */ "vdbe_eqp",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 78, 1,
+	 /* ColNames:  */ 76, 1,
 	 /* iArg:      */ SQL_VdbeEQP},
 	{ /* zName:     */ "vdbe_listing",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 80, 1,
+	 /* ColNames:  */ 78, 1,
 	 /* iArg:      */ SQL_VdbeListing},
 	{ /* zName:     */ "vdbe_trace",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 82, 1,
+	 /* ColNames:  */ 80, 1,
 	 /* iArg:      */ SQL_VdbeTrace},
 	{ /* zName:     */ "where_trace",
 	/* ePragTyp:  */ PragTyp_FLAG,
 	/* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	/* ColNames:  */ 84, 1,
+	/* ColNames:  */ 82, 1,
 	/* iArg:      */ SQL_WhereTrace},
 #endif
 };
diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h
index d1d1a11..09748a6 100644
--- a/src/box/sql/sqlInt.h
+++ b/src/box/sql/sqlInt.h
@@ -1194,7 +1194,6 @@ struct sql {
 #define SQL_SelectTrace    0x00000800       /* Debug info about select statement */
 #define SQL_WhereTrace     0x00008000       /* Debug info about optimizer's work */
 #define SQL_VdbeListing    0x00000400	/* Debug listings of VDBE programs */
-#define SQL_VdbeAddopTrace 0x00001000	/* Trace sqlVdbeAddOp() calls */
 #define SQL_ReverseOrder   0x00020000	/* Reverse unordered SELECTs */
 #define SQL_RecTriggers    0x00040000	/* Enable recursive triggers */
 #define SQL_AutoIndex      0x00100000	/* Enable automatic indexes */
diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
index 579f515..c63472c 100644
--- a/src/box/sql/vdbeaux.c
+++ b/src/box/sql/vdbeaux.c
@@ -165,9 +165,9 @@ growOpArray(Vdbe * v, int nOp)
 }
 
 #ifdef SQL_DEBUG
-/* This routine is just a convenient place to set a breakpoint that will
- * fire after each opcode is inserted and displayed using
- * "PRAGMA vdbe_addoptrace=on".
+/*
+ * This routine is just a convenient place to set a breakpoint
+ * that will fire after each opcode is inserted in debug build.
  */
 static void
 test_addop_breakpoint(void)
@@ -230,20 +230,7 @@ sqlVdbeAddOp3(Vdbe * p, int op, int p1, int p2, int p3)
 	pOp->zComment = 0;
 #endif
 #ifdef SQL_DEBUG
-	if (user_session->sql_flags & SQL_VdbeAddopTrace) {
-		int jj, kk;
-		Parse *pParse = p->pParse;
-		for (jj = kk = 0; jj < pParse->nColCache; jj++) {
-			struct yColCache *x = pParse->aColCache + jj;
-			printf(" r[%d]={%d:%d}", x->iReg, x->iTable,
-			       x->iColumn);
-			kk++;
-		}
-		if (kk)
-			printf("\n");
-		sqlVdbePrintOp(0, i, &p->aOp[i]);
-		test_addop_breakpoint();
-	}
+	test_addop_breakpoint();
 #endif
 #ifdef VDBE_PROFILE
 	pOp->cycles = 0;
diff --git a/test/sql/sql-debug.result b/test/sql/sql-debug.result
index ce87f11..150f1ec 100644
--- a/test/sql/sql-debug.result
+++ b/test/sql/sql-debug.result
@@ -46,7 +46,6 @@ box.execute('PRAGMA')
   - ['reverse_unordered_selects', 0]
   - ['select_trace', 0]
   - ['sql_trace', 0]
-  - ['vdbe_addoptrace', 0]
   - ['vdbe_debug', 0]
   - ['vdbe_eqp', 0]
   - ['vdbe_listing', 0]
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 5/9] box: introduce 'service' engine
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
                   ` (3 preceding siblings ...)
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 4/9] sql: remove PRAGMA "vdbe_addoptrace" imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 6/9] box: introduce _session_settings system space imeevma
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

This patch introduces a new engine called "service" that will be
used to create a new system space. The main idea of this engine is
that it will not have a predefined space_vtab. With this engine,
we can create unusual spaces with their own vtab and behavior.

Due to the nature of this engine, it can only be used to create
system spaces.

Part of #4511
---
 src/box/CMakeLists.txt                             |  1 +
 src/box/box.cc                                     |  4 +
 src/box/service_engine.c                           | 95 ++++++++++++++++++++++
 src/box/service_engine.h                           | 53 ++++++++++++
 ...h-4511-access-settings-from-any-frontend.result | 10 +++
 ...4511-access-settings-from-any-frontend.test.lua |  4 +
 6 files changed, 167 insertions(+)
 create mode 100644 src/box/service_engine.c
 create mode 100644 src/box/service_engine.h
 create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.result
 create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.test.lua

diff --git a/src/box/CMakeLists.txt b/src/box/CMakeLists.txt
index c0afa63..cc67a63 100644
--- a/src/box/CMakeLists.txt
+++ b/src/box/CMakeLists.txt
@@ -81,6 +81,7 @@ add_library(box STATIC
     memtx_space.c
     sysview.c
     blackhole.c
+    service_engine.c
     vinyl.c
     vy_stmt.c
     vy_mem.c
diff --git a/src/box/box.cc b/src/box/box.cc
index 5a8e4d3..d2b463d 100644
--- a/src/box/box.cc
+++ b/src/box/box.cc
@@ -53,6 +53,7 @@
 #include "memtx_engine.h"
 #include "sysview.h"
 #include "blackhole.h"
+#include "service_engine.h"
 #include "vinyl.h"
 #include "space.h"
 #include "index.h"
@@ -1922,6 +1923,9 @@ engine_init()
 	struct sysview_engine *sysview = sysview_engine_new_xc();
 	engine_register((struct engine *)sysview);
 
+	struct engine *service_engine = service_engine_new_xc();
+	engine_register(service_engine);
+
 	struct engine *blackhole = blackhole_engine_new_xc();
 	engine_register(blackhole);
 
diff --git a/src/box/service_engine.c b/src/box/service_engine.c
new file mode 100644
index 0000000..67f8422
--- /dev/null
+++ b/src/box/service_engine.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2010-2019, Tarantool AUTHORS, please see AUTHORS file.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the
+ *    following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include "service_engine.h"
+#include "schema.h"
+
+static void
+service_engine_shutdown(struct engine *engine)
+{
+	free(engine);
+}
+
+static struct space *
+service_engine_create_space(struct engine *engine, struct space_def *def,
+			    struct rlist *key_list)
+{
+	(void)engine;
+	(void)def;
+	(void)key_list;
+	/* There are currently no spaces with this engine. */
+	diag_set(ClientError, ER_UNSUPPORTED, "Tarantool",
+		 "spaces with 'service' engine.");
+	return NULL;
+}
+
+static const struct engine_vtab service_engine_vtab = {
+	/* .shutdown = */ service_engine_shutdown,
+	/* .create_space = */ service_engine_create_space,
+	/* .prepare_join = */ generic_engine_prepare_join,
+	/* .join = */ generic_engine_join,
+	/* .complete_join = */ generic_engine_complete_join,
+	/* .begin = */ generic_engine_begin,
+	/* .begin_statement = */ generic_engine_begin_statement,
+	/* .prepare = */ generic_engine_prepare,
+	/* .commit = */ generic_engine_commit,
+	/* .rollback_statement = */ generic_engine_rollback_statement,
+	/* .rollback = */ generic_engine_rollback,
+	/* .switch_to_ro = */ generic_engine_switch_to_ro,
+	/* .bootstrap = */ generic_engine_bootstrap,
+	/* .begin_initial_recovery = */ generic_engine_begin_initial_recovery,
+	/* .begin_final_recovery = */ generic_engine_begin_final_recovery,
+	/* .end_recovery = */ generic_engine_end_recovery,
+	/* .begin_checkpoint = */ generic_engine_begin_checkpoint,
+	/* .wait_checkpoint = */ generic_engine_wait_checkpoint,
+	/* .commit_checkpoint = */ generic_engine_commit_checkpoint,
+	/* .abort_checkpoint = */ generic_engine_abort_checkpoint,
+	/* .collect_garbage = */ generic_engine_collect_garbage,
+	/* .backup = */ generic_engine_backup,
+	/* .memory_stat = */ generic_engine_memory_stat,
+	/* .reset_stat = */ generic_engine_reset_stat,
+	/* .check_space_def = */ generic_engine_check_space_def,
+};
+
+struct engine *
+service_engine_new(void)
+{
+	struct engine *service_engine = calloc(1, sizeof(*service_engine));
+	if (service_engine == NULL) {
+		diag_set(OutOfMemory, sizeof(*service_engine), "calloc",
+			 "service_engine");
+		return NULL;
+	}
+
+	service_engine->vtab = &service_engine_vtab;
+	service_engine->name = "service";
+	service_engine->flags = ENGINE_BYPASS_TX;
+	return service_engine;
+}
diff --git a/src/box/service_engine.h b/src/box/service_engine.h
new file mode 100644
index 0000000..48e2518
--- /dev/null
+++ b/src/box/service_engine.h
@@ -0,0 +1,53 @@
+#pragma once
+/*
+ * Copyright 2010-2019, Tarantool AUTHORS, please see AUTHORS file.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the
+ *    following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+struct engine *
+service_engine_new(void);
+
+#if defined(__cplusplus)
+} /* extern "C" */
+
+#include "diag.h"
+
+static inline struct engine *
+service_engine_new_xc(void)
+{
+	struct engine *service_engine = service_engine_new();
+	if (service_engine == NULL)
+		diag_raise();
+	return service_engine;
+}
+
+#endif /* defined(__plusplus) */
diff --git a/test/box/gh-4511-access-settings-from-any-frontend.result b/test/box/gh-4511-access-settings-from-any-frontend.result
new file mode 100644
index 0000000..de8bcb7
--- /dev/null
+++ b/test/box/gh-4511-access-settings-from-any-frontend.result
@@ -0,0 +1,10 @@
+-- test-run result file version 2
+test_run = require('test_run').new()
+ | ---
+ | ...
+
+-- User cannot create spaces with this engine.
+s = box.schema.space.create('test', {engine = 'service'})
+ | ---
+ | - error: Tarantool does not support spaces with 'service' engine.
+ | ...
diff --git a/test/box/gh-4511-access-settings-from-any-frontend.test.lua b/test/box/gh-4511-access-settings-from-any-frontend.test.lua
new file mode 100644
index 0000000..e2d212d
--- /dev/null
+++ b/test/box/gh-4511-access-settings-from-any-frontend.test.lua
@@ -0,0 +1,4 @@
+test_run = require('test_run').new()
+
+-- User cannot create spaces with this engine.
+s = box.schema.space.create('test', {engine = 'service'})
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 6/9] box: introduce _session_settings system space
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
                   ` (4 preceding siblings ...)
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 5/9] box: introduce 'service' engine imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 7/9] box: add SQL settings to _session_settings imeevma
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

This patch creates _session_settings system space. This space is
used to view and change session settings. This space is one of the
special spaces that have a "service" engine. The main idea of this
space is that it will not store tuples, but when you call the
get() or select() methods, it creates tuples on the fly. Because
of this, even if the same setting is asked, the returned tuples
will be different. In addition, this space allows you to change
the setting value using the update() method, in which case it
directly changes the setting value.

There are no settings at the moment, some will be added in the
next patch.

Part of #4511
---
 src/box/CMakeLists.txt                             |   1 +
 src/box/bootstrap.snap                             | Bin 5921 -> 5976 bytes
 src/box/lua/space.cc                               |   2 +
 src/box/lua/upgrade.lua                            |  15 +
 src/box/schema_def.h                               |   8 +
 src/box/service_engine.c                           |  54 ++-
 src/box/session_settings.c                         | 472 +++++++++++++++++++++
 src/box/session_settings.h                         |  69 +++
 test/app-tap/tarantoolctl.test.lua                 |   4 +-
 test/box-py/bootstrap.result                       |   3 +
 test/box/access_sysview.result                     |   6 +-
 test/box/alter.result                              |   5 +-
 ...h-4511-access-settings-from-any-frontend.result | 108 ++++-
 ...4511-access-settings-from-any-frontend.test.lua |  37 ++
 test/wal_off/alter.result                          |   2 +-
 15 files changed, 770 insertions(+), 16 deletions(-)
 create mode 100644 src/box/session_settings.c
 create mode 100644 src/box/session_settings.h

diff --git a/src/box/lua/space.cc b/src/box/lua/space.cc
index f6e96f0..01b58af 100644
--- a/src/box/lua/space.cc
+++ b/src/box/lua/space.cc
@@ -653,6 +653,8 @@ box_lua_space_init(struct lua_State *L)
 	lua_setfield(L, -2, "SPACE_SEQUENCE_ID");
 	lua_pushnumber(L, BOX_FUNC_INDEX_ID);
 	lua_setfield(L, -2, "FUNC_INDEX_ID");
+	lua_pushnumber(L, BOX_SESSION_SETTINGS_ID);
+	lua_setfield(L, -2, "SESSION_SETTINGS_ID");
 	lua_pushnumber(L, BOX_SYSTEM_ID_MIN);
 	lua_setfield(L, -2, "SYSTEM_ID_MIN");
 	lua_pushnumber(L, BOX_SYSTEM_ID_MAX);
diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
index 07f1e03..c69b6b5 100644
--- a/src/box/lua/upgrade.lua
+++ b/src/box/lua/upgrade.lua
@@ -951,8 +951,23 @@ local function drop_func_collation()
     _func.index.name:alter({parts = {{'name', 'string'}}})
 end
 
+local function create_session_settings_space()
+    local _space = box.space[box.schema.SPACE_ID]
+    local _index = box.space[box.schema.INDEX_ID]
+    local format = {}
+    format[1] = {name='name', type='string'}
+    format[2] = {name='value', type='any'}
+    log.info("create space _session_settings")
+    _space:insert{box.schema.SESSION_SETTINGS_ID, ADMIN, '_session_settings',
+                  'service', 2, {temporary = true}, format}
+    log.info("create index _session_settings:primary")
+    _index:insert{box.schema.SESSION_SETTINGS_ID, 0, 'primary', 'tree',
+                  {unique = true}, {{0, 'string'}}}
+end
+
 local function upgrade_to_2_3_1()
     drop_func_collation()
+    create_session_settings_space()
 end
 
 --------------------------------------------------------------------------------
diff --git a/src/box/schema_def.h b/src/box/schema_def.h
index ba870ff..f86cd42 100644
--- a/src/box/schema_def.h
+++ b/src/box/schema_def.h
@@ -114,6 +114,8 @@ enum {
 	BOX_CK_CONSTRAINT_ID = 364,
 	/** Space id of _func_index. */
 	BOX_FUNC_INDEX_ID = 372,
+	/** Space id of _session_settings. */
+	BOX_SESSION_SETTINGS_ID = 380,
 	/** End of the reserved range of system spaces. */
 	BOX_SYSTEM_ID_MAX = 511,
 	BOX_ID_NIL = 2147483647
@@ -277,6 +279,12 @@ enum {
 	BOX_FUNC_INDEX_FUNCTION_ID = 2,
 };
 
+/** _session_settings fields. */
+enum {
+	BOX_SESSION_SETTINGS_FIELD_NAME = 0,
+	BOX_SESSION_SETTINGS_FIELD_VALUE = 1,
+};
+
 /*
  * Different objects which can be subject to access
  * control.
diff --git a/src/box/service_engine.c b/src/box/service_engine.c
index 67f8422..5a33a73 100644
--- a/src/box/service_engine.c
+++ b/src/box/service_engine.c
@@ -29,8 +29,11 @@
  * SUCH DAMAGE.
  */
 #include "service_engine.h"
+#include "tuple.h"
 #include "schema.h"
 
+extern const struct space_vtab session_settings_space_vtab;
+
 static void
 service_engine_shutdown(struct engine *engine)
 {
@@ -41,13 +44,50 @@ static struct space *
 service_engine_create_space(struct engine *engine, struct space_def *def,
 			    struct rlist *key_list)
 {
-	(void)engine;
-	(void)def;
-	(void)key_list;
-	/* There are currently no spaces with this engine. */
-	diag_set(ClientError, ER_UNSUPPORTED, "Tarantool",
-		 "spaces with 'service' engine.");
-	return NULL;
+	/*
+	 * At the moment the only space that have this engine is
+	 * _session_sessings.
+	 */
+	if (def->id != BOX_SESSION_SETTINGS_ID) {
+		diag_set(ClientError, ER_UNSUPPORTED, "Tarantool",
+			 "non-system space with 'service' engine.");
+		return NULL;
+	}
+	const struct space_vtab *space_vtab = &session_settings_space_vtab;
+
+	struct space *space = (struct space *)calloc(1, sizeof(*space));
+	if (space == NULL) {
+		diag_set(OutOfMemory, sizeof(*space), "calloc", "space");
+		return NULL;
+	}
+	int key_count = 0;
+	struct key_def **keys = index_def_to_key_def(key_list, &key_count);
+	if (keys == NULL) {
+		free(space);
+		return NULL;
+	}
+	struct tuple_format *format =
+		tuple_format_new(&tuple_format_runtime->vtab, NULL, keys,
+				 key_count, def->fields, def->field_count,
+				 def->exact_field_count, def->dict,
+				 def->opts.is_temporary,
+				 def->opts.is_ephemeral);
+	if (format == NULL) {
+		free(space);
+		return NULL;
+	}
+	tuple_format_ref(format);
+	int rc = space_create(space, engine, space_vtab, def, key_list, format);
+	/*
+	 * Format is now referenced by the space if space has beed
+	 * created.
+	 */
+	tuple_format_unref(format);
+	if (rc != 0) {
+		free(space);
+		return NULL;
+	}
+	return space;
 }
 
 static const struct engine_vtab service_engine_vtab = {
diff --git a/src/box/session_settings.c b/src/box/session_settings.c
new file mode 100644
index 0000000..a969d3d
--- /dev/null
+++ b/src/box/session_settings.c
@@ -0,0 +1,472 @@
+/*
+ * Copyright 2010-2019, Tarantool AUTHORS, please see AUTHORS file.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the
+ *    following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include "session_settings.h"
+#include "xrow_update.h"
+#include "service_engine.h"
+#include "column_mask.h"
+#include "session.h"
+#include "schema.h"
+#include "tuple.h"
+#include "xrow.h"
+#include "sql.h"
+
+struct session_setting_module
+	session_setting_modules[session_setting_type_MAX] = {};
+
+struct session_settings_index {
+	/** Base index. Must be the first member. */
+	struct index base;
+	/**
+	 * Format of the tuples iterators of this index return. It
+	 * is stored here so as not to lookup space each time to
+	 * get a format and create an iterator.
+	 */
+	struct tuple_format *format;
+};
+
+struct session_settings_iterator {
+	/** Base iterator. Must be the first member. */
+	struct iterator base;
+	/**
+	 * Format of the tuples this iterator returns. It is
+	 * stored here so as not to lookup space each time to get
+	 * a format for selected tuples.
+	 */
+	struct tuple_format *format;
+	/**
+	 * ID of the current session settings module in the global
+	 * list of the modules.
+	 */
+	int module_id;
+	/** ID of the setting in current module. */
+	int setting_id;
+	/** Decoded key. */
+	char *key;
+	/** True if the iterator returns only equal keys. */
+	bool is_eq;
+	/** True if the iterator should include equal keys. */
+	bool is_including;
+};
+
+static void
+session_settings_iterator_free(struct iterator *ptr)
+{
+	struct session_settings_iterator *it =
+		(struct session_settings_iterator *)ptr;
+	free(it->key);
+	free(it);
+}
+
+static int
+session_settings_next_in_module(const struct session_setting_module *module,
+				int *sid, const char *key, bool is_eq,
+				bool is_including)
+{
+	int i = *sid;
+	int count = module->setting_count;
+	if (i >= count)
+		return -1;
+	if (key == NULL)
+		return 0;
+	assert(i >= 0);
+	const char **name = &module->settings[i];
+	for (; i < count; ++i, ++name) {
+		int cmp = strcmp(*name, key);
+		if ((cmp == 0 && is_including) ||
+		    (cmp > 0 && !is_eq)) {
+			*sid = i;
+			return 0;
+		}
+	}
+	*sid = count;
+	return -1;
+}
+
+static int
+session_settings_prev_in_module(const struct session_setting_module *module,
+				int *sid, const char *key, bool is_eq,
+				bool is_including)
+{
+	int i = *sid;
+	int count = module->setting_count;
+	if (i < 0)
+		return -1;
+	if (key == NULL)
+		return 0;
+	if (i >= count)
+		i = count - 1;
+	const char **name = &module->settings[i];
+	for (; i >= 0; --i, --name) {
+		int cmp = strcmp(*name, key);
+		if ((cmp == 0 && is_including) ||
+		    (cmp < 0 && !is_eq)) {
+			*sid = i;
+			return 0;
+		}
+	}
+	*sid = -1;
+	return -1;
+}
+
+static int
+session_settings_iterator_next(struct iterator *iterator, struct tuple **result)
+{
+	struct session_settings_iterator *it =
+		(struct session_settings_iterator *)iterator;
+	int mid = it->module_id, sid = it->setting_id;
+	struct session_setting_module *module;
+	const char *key = it->key;
+	bool is_including = it->is_including, is_eq = it->is_eq;
+	bool is_found = false;
+	for (; mid < session_setting_type_MAX; ++mid, sid = 0) {
+		module = &session_setting_modules[mid];
+		if (session_settings_next_in_module(module, &sid, key, is_eq,
+						    is_including) == 0) {
+			is_found = true;
+			break;
+		}
+	}
+	it->module_id = mid;
+	it->setting_id = sid + 1;
+	if (!is_found) {
+		*result = NULL;
+		return 0;
+	}
+	const char *mp_pair, *mp_pair_end;
+	module->get(sid, &mp_pair, &mp_pair_end);
+	*result = box_tuple_new(it->format, mp_pair, mp_pair_end);
+	return *result != NULL ? 0 : -1;
+}
+
+static int
+session_settings_iterator_prev(struct iterator *iterator, struct tuple **result)
+{
+	struct session_settings_iterator *it =
+		(struct session_settings_iterator *)iterator;
+	int mid = it->module_id, sid = it->setting_id;
+	struct session_setting_module *module;
+	const char *key = it->key;
+	bool is_including = it->is_including, is_eq = it->is_eq;
+	bool is_found = false;
+	for (; mid >= 0; --mid, sid = INT_MAX) {
+		module = &session_setting_modules[mid];
+		if (session_settings_prev_in_module(module, &sid, key, is_eq,
+						    is_including) == 0) {
+			is_found = true;
+			break;
+		}
+	}
+	it->module_id = mid;
+	it->setting_id = sid - 1;
+	if (!is_found) {
+		*result = NULL;
+		return 0;
+	}
+	const char *mp_pair, *mp_pair_end;
+	module->get(sid, &mp_pair, &mp_pair_end);
+	*result = box_tuple_new(it->format, mp_pair, mp_pair_end);
+	return *result != NULL ? 0 : -1;
+}
+
+static void
+session_settings_index_destroy(struct index *index)
+{
+	free(index);
+}
+
+static struct iterator *
+session_settings_index_create_iterator(struct index *base,
+				       enum iterator_type type, const char *key,
+				       uint32_t part_count)
+{
+	struct session_settings_index *index =
+		(struct session_settings_index *)base;
+	char *decoded_key = NULL;
+	if (part_count > 0) {
+		assert(part_count == 1);
+		assert(mp_typeof(*key) == MP_STR);
+		uint32_t len;
+		const char *name = mp_decode_str(&key, &len);
+		decoded_key = (char *)malloc(len + 1);
+		if (decoded_key == NULL) {
+			diag_set(OutOfMemory, len + 1, "malloc", "decoded_key");
+			return NULL;
+		}
+		memcpy(decoded_key, name, len);
+		decoded_key[len] = '\0';
+	}
+	struct session_settings_iterator *it =
+		(struct session_settings_iterator *)malloc(sizeof(*it));
+	if (it == NULL) {
+		diag_set(OutOfMemory, sizeof(*it), "malloc", "it");
+		free(decoded_key);
+		return NULL;
+	}
+	iterator_create(&it->base, base);
+	it->base.free = session_settings_iterator_free;
+	it->key = decoded_key;
+	it->is_eq = type == ITER_EQ || type == ITER_REQ;
+	it->is_including = it->is_eq || type == ITER_GE || type == ITER_ALL ||
+			   type == ITER_LE;
+	it->format = index->format;
+	if (!iterator_type_is_reverse(type)) {
+		it->base.next = session_settings_iterator_next;
+		it->module_id = 0;
+		it->setting_id = 0;
+	} else {
+		it->base.next = session_settings_iterator_prev;
+		it->module_id = session_setting_type_MAX - 1;
+		struct session_setting_module *module =
+			&session_setting_modules[it->module_id];
+		it->setting_id = module->setting_count - 1;
+	}
+	return (struct iterator *)it;
+}
+
+static int
+session_settings_index_get(struct index *base, const char *key,
+			   uint32_t part_count, struct tuple **result)
+{
+	struct session_settings_index *index =
+		(struct session_settings_index *) base;
+	assert(part_count == 1);
+	(void) part_count;
+	uint32_t len;
+	key = mp_decode_str(&key, &len);
+	key = tt_cstr(key, len);
+	struct session_setting_module *module = &session_setting_modules[0];
+	struct session_setting_module *end = module + session_setting_type_MAX;
+	int sid = 0;
+	for (; module < end; ++module, sid = 0) {
+		if (session_settings_next_in_module(module, &sid, key, true,
+						    true) == 0)
+			goto found;
+	}
+	*result = NULL;
+	return 0;
+found:;
+	const char *mp_pair;
+	const char *mp_pair_end;
+	module->get(sid, &mp_pair, &mp_pair_end);
+	*result = box_tuple_new(index->format, mp_pair, mp_pair_end);
+	return *result != NULL ? 0 : -1;
+}
+
+static const struct index_vtab session_settings_index_vtab = {
+	/* .destroy = */ session_settings_index_destroy,
+	/* .commit_create = */ generic_index_commit_create,
+	/* .abort_create = */ generic_index_abort_create,
+	/* .commit_modify = */ generic_index_commit_modify,
+	/* .commit_drop = */ generic_index_commit_drop,
+	/* .update_def = */ generic_index_update_def,
+	/* .depends_on_pk = */ generic_index_depends_on_pk,
+	/* .def_change_requires_rebuild = */
+		generic_index_def_change_requires_rebuild,
+	/* .size = */ generic_index_size,
+	/* .bsize = */ generic_index_bsize,
+	/* .min = */ generic_index_min,
+	/* .max = */ generic_index_max,
+	/* .random = */ generic_index_random,
+	/* .count = */ generic_index_count,
+	/* .get = */ session_settings_index_get,
+	/* .replace = */ generic_index_replace,
+	/* .create_iterator = */ session_settings_index_create_iterator,
+	/* .create_snapshot_iterator = */
+		generic_index_create_snapshot_iterator,
+	/* .stat = */ generic_index_stat,
+	/* .compact = */ generic_index_compact,
+	/* .reset_stat = */ generic_index_reset_stat,
+	/* .begin_build = */ generic_index_begin_build,
+	/* .reserve = */ generic_index_reserve,
+	/* .build_next = */ generic_index_build_next,
+	/* .end_build = */ generic_index_end_build,
+};
+
+static void
+session_settings_space_destroy(struct space *space)
+{
+	free(space);
+}
+
+static int
+session_settings_space_execute_replace(struct space *space, struct txn *txn,
+				       struct request *request,
+				       struct tuple **result)
+{
+	(void)space;
+	(void)txn;
+	(void)request;
+	(void)result;
+	diag_set(ClientError, ER_UNSUPPORTED, "Session_settings space",
+		 "replace()");
+	return -1;
+}
+
+static int
+session_settings_space_execute_delete(struct space *space, struct txn *txn,
+				      struct request *request,
+				      struct tuple **result)
+{
+	(void)space;
+	(void)txn;
+	(void)request;
+	(void)result;
+	diag_set(ClientError, ER_UNSUPPORTED, "Session_settings space",
+		 "delete()");
+	return -1;
+}
+
+static int
+session_settings_space_execute_update(struct space *space, struct txn *txn,
+				      struct request *request,
+				      struct tuple **result)
+{
+	(void)txn;
+	struct tuple_format *format = space->format;
+	const char *old_data, *old_data_end, *new_data;
+	struct region *region = &fiber()->gc;
+	size_t used = region_used(region);
+	int rc = -1, sid = 0;
+	struct index_def *pk_def = space->index[0]->def;
+	uint64_t column_mask;
+
+	const char *new_key, *key = request->key;
+	uint32_t new_size, new_key_len, key_len = mp_decode_array(&key);
+	if (key_len == 0) {
+		diag_set(ClientError, ER_EXACT_MATCH, 1, 0);
+		return -1;
+	}
+	if (key_len > 1 || mp_typeof(*key) != MP_STR) {
+		diag_set(ClientError, ER_KEY_PART_TYPE, 0, "string");
+		return -1;
+	}
+	key = mp_decode_str(&key, &key_len);
+	key = tt_cstr(key, key_len);
+	struct session_setting_module *module = &session_setting_modules[0];
+	struct session_setting_module *end = module + session_setting_type_MAX;
+	for (; module < end; ++module, sid = 0) {
+		if (session_settings_next_in_module(module, &sid, key, true,
+						    true) == 0)
+			goto found;
+	}
+	*result = NULL;
+	return 0;
+found:
+	module->get(sid, &old_data, &old_data_end);
+	new_data = xrow_update_execute(request->tuple, request->tuple_end,
+				       old_data, old_data_end, format->dict,
+				       &new_size, request->index_base,
+				       &column_mask);
+	if (new_data == NULL)
+		goto finish;
+	*result = box_tuple_new(format, new_data, new_data + new_size);
+	if (*result == NULL)
+		goto finish;
+
+	mp_decode_array(&new_data);
+	new_key = mp_decode_str(&new_data, &new_key_len);
+	if (!key_update_can_be_skipped(pk_def->key_def->column_mask,
+				       column_mask)) {
+		if (key_len != new_key_len ||
+		    memcmp(key, new_key, key_len) != 0) {
+			diag_set(ClientError, ER_CANT_UPDATE_PRIMARY_KEY,
+				 pk_def->name, space_name(space));
+			goto finish;
+		}
+	}
+	if (module->set(sid, new_data) != 0)
+		goto finish;
+	rc = 0;
+finish:
+	region_truncate(region, used);
+	return rc;
+}
+
+static int
+session_settings_space_execute_upsert(struct space *space, struct txn *txn,
+				      struct request *request)
+{
+	(void)space;
+	(void)txn;
+	(void)request;
+	diag_set(ClientError, ER_UNSUPPORTED, "Session_settings space",
+		 "upsert()");
+	return -1;
+}
+
+static struct index *
+session_settings_space_create_index(struct space *space, struct index_def *def)
+{
+	assert(space->def->id == BOX_SESSION_SETTINGS_ID);
+	if (def->iid != 0) {
+		diag_set(ClientError, ER_UNSUPPORTED, "Session_settings space",
+			 "create_index()");
+		return NULL;
+	}
+
+	struct session_settings_index *index =
+		(struct session_settings_index *)calloc(1, sizeof(*index));
+	if (index == NULL) {
+		diag_set(OutOfMemory, sizeof(*index), "calloc", "index");
+		return NULL;
+	}
+	if (index_create(&index->base, space->engine,
+			 &session_settings_index_vtab, def) != 0) {
+		free(index);
+		return NULL;
+	}
+
+	index->format = space->format;
+	return &index->base;
+}
+
+const struct space_vtab session_settings_space_vtab = {
+	/* .destroy = */ session_settings_space_destroy,
+	/* .bsize = */ generic_space_bsize,
+	/* .execute_replace = */ session_settings_space_execute_replace,
+	/* .execute_delete = */ session_settings_space_execute_delete,
+	/* .execute_update = */ session_settings_space_execute_update,
+	/* .execute_upsert = */ session_settings_space_execute_upsert,
+	/* .ephemeral_replace = */ generic_space_ephemeral_replace,
+	/* .ephemeral_delete = */ generic_space_ephemeral_delete,
+	/* .ephemeral_rowid_next = */ generic_space_ephemeral_rowid_next,
+	/* .init_system_space = */ generic_init_system_space,
+	/* .init_ephemeral_space = */ generic_init_ephemeral_space,
+	/* .check_index_def = */ generic_space_check_index_def,
+	/* .create_index = */ session_settings_space_create_index,
+	/* .add_primary_key = */ generic_space_add_primary_key,
+	/* .drop_primary_key = */ generic_space_drop_primary_key,
+	/* .check_format = */ generic_space_check_format,
+	/* .build_index = */ generic_space_build_index,
+	/* .swap_index = */ generic_space_swap_index,
+	/* .prepare_alter = */ generic_space_prepare_alter,
+	/* .invalidate = */ generic_space_invalidate,
+};
diff --git a/src/box/session_settings.h b/src/box/session_settings.h
new file mode 100644
index 0000000..7415e0e
--- /dev/null
+++ b/src/box/session_settings.h
@@ -0,0 +1,69 @@
+#pragma once
+/*
+ * Copyright 2010-2019, Tarantool AUTHORS, please see AUTHORS file.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the
+ *    following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials
+ *    provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/**
+ * Session has settings. Settings belong to different subsystems,
+ * such as SQL. Each subsystem registers here its session setting
+ * type and a set of settings with getter and setter functions.
+ * The self-registration of modules allows session setting code
+ * not to depend on all the subsystems.
+ *
+ * The types should be ordered in alphabetical order, because the
+ * type list is used by setting iterators.
+ */
+enum session_setting_type {
+	session_setting_type_MAX,
+};
+
+struct session_setting_module {
+	/**
+	 * An array of setting names. All of them should have the
+	 * same prefix.
+	 */
+	const char **settings;
+	/** Count of settings. */
+	int setting_count;
+	/**
+	 * Get a MessagePack encoded pair [name, value] for a
+	 * setting having index @a id. Index is from the settings
+	 * array.
+	 */
+	void (*get)(int id, const char **mp_pair, const char **mp_pair_end);
+	/**
+	 * Set value of a setting by a given @a id from a
+	 * MessagePack encoded buffer. Note, it is not a pair, but
+	 * just value.
+	 */
+	int (*set)(int id, const char *mp_value);
+};
+
+extern struct session_setting_module session_setting_modules[];
diff --git a/test/app-tap/tarantoolctl.test.lua b/test/app-tap/tarantoolctl.test.lua
index 7a07860..4d70595 100755
--- a/test/app-tap/tarantoolctl.test.lua
+++ b/test/app-tap/tarantoolctl.test.lua
@@ -415,8 +415,8 @@ do
             check_ctlcat_xlog(test_i, dir, "--from=3 --to=6 --format=json --show-system --replica 1", "\n", 3)
             check_ctlcat_xlog(test_i, dir, "--from=3 --to=6 --format=json --show-system --replica 1 --replica 2", "\n", 3)
             check_ctlcat_xlog(test_i, dir, "--from=3 --to=6 --format=json --show-system --replica 2", "\n", 0)
-            check_ctlcat_snap(test_i, dir, "--space=280", "---\n", 24)
-            check_ctlcat_snap(test_i, dir, "--space=288", "---\n", 52)
+            check_ctlcat_snap(test_i, dir, "--space=280", "---\n", 25)
+            check_ctlcat_snap(test_i, dir, "--space=288", "---\n", 53)
         end)
     end)
 
diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result
index 938a763..0876e77 100644
--- a/test/box-py/bootstrap.result
+++ b/test/box-py/bootstrap.result
@@ -96,6 +96,8 @@ box.space._space:select{}
         'type': 'boolean'}]]
   - [372, 1, '_func_index', 'memtx', 0, {}, [{'name': 'space_id', 'type': 'unsigned'},
       {'name': 'index_id', 'type': 'unsigned'}, {'name': 'func_id', 'type': 'unsigned'}]]
+  - [380, 1, '_session_settings', 'service', 2, {'temporary': true}, [{'name': 'name',
+        'type': 'string'}, {'name': 'value', 'type': 'any'}]]
 ...
 box.space._index:select{}
 ---
@@ -153,6 +155,7 @@ box.space._index:select{}
   - [364, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned'], [1, 'string']]]
   - [372, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned'], [1, 'unsigned']]]
   - [372, 1, 'fid', 'tree', {'unique': false}, [[2, 'unsigned']]]
+  - [380, 0, 'primary', 'tree', {'unique': true}, [[0, 'string']]]
 ...
 box.space._user:select{}
 ---
diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result
index 1f33dec..799d19f 100644
--- a/test/box/access_sysview.result
+++ b/test/box/access_sysview.result
@@ -246,11 +246,11 @@ box.session.su('guest')
 ...
 #box.space._vspace:select{}
 ---
-- 25
+- 26
 ...
 #box.space._vindex:select{}
 ---
-- 53
+- 54
 ...
 #box.space._vuser:select{}
 ---
@@ -282,7 +282,7 @@ box.session.su('guest')
 ...
 #box.space._vindex:select{}
 ---
-- 53
+- 54
 ...
 #box.space._vuser:select{}
 ---
diff --git a/test/box/alter.result b/test/box/alter.result
index 9a2f991..f150faa 100644
--- a/test/box/alter.result
+++ b/test/box/alter.result
@@ -92,7 +92,7 @@ space = box.space[t[1]]
 ...
 space.id
 ---
-- 373
+- 381
 ...
 space.field_count
 ---
@@ -137,7 +137,7 @@ space_deleted
 ...
 space:replace{0}
 ---
-- error: Space '373' does not exist
+- error: Space '381' does not exist
 ...
 _index:insert{_space.id, 0, 'primary', 'tree', {unique=true}, {{0, 'unsigned'}}}
 ---
@@ -220,6 +220,7 @@ _index:select{}
   - [364, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned'], [1, 'string']]]
   - [372, 0, 'primary', 'tree', {'unique': true}, [[0, 'unsigned'], [1, 'unsigned']]]
   - [372, 1, 'fid', 'tree', {'unique': false}, [[2, 'unsigned']]]
+  - [380, 0, 'primary', 'tree', {'unique': true}, [[0, 'string']]]
 ...
 -- modify indexes of a system space
 _index:delete{_index.id, 0}
diff --git a/test/box/gh-4511-access-settings-from-any-frontend.result b/test/box/gh-4511-access-settings-from-any-frontend.result
index de8bcb7..7acdd95 100644
--- a/test/box/gh-4511-access-settings-from-any-frontend.result
+++ b/test/box/gh-4511-access-settings-from-any-frontend.result
@@ -6,5 +6,111 @@ test_run = require('test_run').new()
 -- User cannot create spaces with this engine.
 s = box.schema.space.create('test', {engine = 'service'})
  | ---
- | - error: Tarantool does not support spaces with 'service' engine.
+ | - error: Tarantool does not support non-system space with 'service' engine.
+ | ...
+
+-- Check _session_settings space.
+s = box.space._session_settings
+ | ---
+ | ...
+s:format()
+ | ---
+ | - [{'name': 'name', 'type': 'string'}, {'name': 'value', 'type': 'any'}]
+ | ...
+
+-- Make sure that we cannot drop space.
+s:drop()
+ | ---
+ | - error: Can't drop the primary key in a system space, space '_session_settings'
+ | ...
+
+--
+-- Make sure, that session_settings space doesn't support
+-- create_index(), insert(), replace() and delete() methods.
+--
+s:create_index('a')
+ | ---
+ | - error: Session_settings space does not support create_index()
+ | ...
+s:insert({'a', 1})
+ | ---
+ | - error: Session_settings space does not support replace()
+ | ...
+s:delete({'b'})
+ | ---
+ | - error: Session_settings space does not support delete()
+ | ...
+s:replace({'sql_defer_foreign_keys', true})
+ | ---
+ | - error: Session_settings space does not support replace()
+ | ...
+
+-- Check get() and select(). They should return nothing for now.
+s:get({'a'})
+ | ---
+ | ...
+s:select()
+ | ---
+ | - []
+ | ...
+s:select({}, {iterator='EQ'})
+ | ---
+ | - []
+ | ...
+s:select({}, {iterator='ALL'})
+ | ---
+ | - []
+ | ...
+s:select({}, {iterator='GE'})
+ | ---
+ | - []
+ | ...
+s:select({}, {iterator='GT'})
+ | ---
+ | - []
+ | ...
+s:select({}, {iterator='REQ'})
+ | ---
+ | - []
+ | ...
+s:select({}, {iterator='LE'})
+ | ---
+ | - []
+ | ...
+s:select({}, {iterator='LT'})
+ | ---
+ | - []
+ | ...
+s:select({'a'}, {iterator='EQ'})
+ | ---
+ | - []
+ | ...
+s:select({'a'}, {iterator='ALL'})
+ | ---
+ | - []
+ | ...
+s:select({'a'}, {iterator='GE'})
+ | ---
+ | - []
+ | ...
+s:select({'a'}, {iterator='GT'})
+ | ---
+ | - []
+ | ...
+s:select({'a'}, {iterator='REQ'})
+ | ---
+ | - []
+ | ...
+s:select({'a'}, {iterator='LE'})
+ | ---
+ | - []
+ | ...
+s:select({'a'}, {iterator='LT'})
+ | ---
+ | - []
+ | ...
+
+-- Currently there is nothing to update, but update() should work.
+s:update('some_option', {{'=', 'value', true}})
+ | ---
  | ...
diff --git a/test/box/gh-4511-access-settings-from-any-frontend.test.lua b/test/box/gh-4511-access-settings-from-any-frontend.test.lua
index e2d212d..d27fec3 100644
--- a/test/box/gh-4511-access-settings-from-any-frontend.test.lua
+++ b/test/box/gh-4511-access-settings-from-any-frontend.test.lua
@@ -2,3 +2,40 @@ test_run = require('test_run').new()
 
 -- User cannot create spaces with this engine.
 s = box.schema.space.create('test', {engine = 'service'})
+
+-- Check _session_settings space.
+s = box.space._session_settings
+s:format()
+
+-- Make sure that we cannot drop space.
+s:drop()
+
+--
+-- Make sure, that session_settings space doesn't support
+-- create_index(), insert(), replace() and delete() methods.
+--
+s:create_index('a')
+s:insert({'a', 1})
+s:delete({'b'})
+s:replace({'sql_defer_foreign_keys', true})
+
+-- Check get() and select(). They should return nothing for now.
+s:get({'a'})
+s:select()
+s:select({}, {iterator='EQ'})
+s:select({}, {iterator='ALL'})
+s:select({}, {iterator='GE'})
+s:select({}, {iterator='GT'})
+s:select({}, {iterator='REQ'})
+s:select({}, {iterator='LE'})
+s:select({}, {iterator='LT'})
+s:select({'a'}, {iterator='EQ'})
+s:select({'a'}, {iterator='ALL'})
+s:select({'a'}, {iterator='GE'})
+s:select({'a'}, {iterator='GT'})
+s:select({'a'}, {iterator='REQ'})
+s:select({'a'}, {iterator='LE'})
+s:select({'a'}, {iterator='LT'})
+
+-- Currently there is nothing to update, but update() should work.
+s:update('some_option', {{'=', 'value', true}})
diff --git a/test/wal_off/alter.result b/test/wal_off/alter.result
index 62cb11d..97f7e6f 100644
--- a/test/wal_off/alter.result
+++ b/test/wal_off/alter.result
@@ -28,7 +28,7 @@ end;
 ...
 #spaces;
 ---
-- 65502
+- 65501
 ...
 -- cleanup
 for k, v in pairs(spaces) do
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 7/9] box: add SQL settings to _session_settings
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
                   ` (5 preceding siblings ...)
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 6/9] box: introduce _session_settings system space imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 8/9] sql: remove control pragmas imeevma
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

Part of #4511

@TarantoolBot document
Title: _session_settings system space
The _session_settings system space used to view or change session
settings.

This space uses a new engine. This allows us to create tuples on
the fly when the get() or select() methods are called. This
engine does not support the insert(), replace(), and delete()
methods. The only way to change the setting value is update(),
which can only be used with the "=" operation.

Because space creates a tuple on the fly, it allows us to get a
tuple without saving it anywhere. But this means that every time
we get a tuple from this system space, it is a new tuple, even if
they look the same:

tarantool> s = box.space._session_settings
tarantool> name = 'sql_default_engine'
tarantool> s:get({name}) == s:get({name})
---
- false
...

Currently, this space contains only SQL settings, since the only
session settings are SQL settings.

List of currently available session settings:

sql_default_engine
sql_defer_foreign_keys
sql_full_column_names
sql_parser_debug
sql_recursive_triggers
sql_reverse_unordered_selects
sql_select_debug
sql_vdbe_debug

The default values of these settings cannot be changed by the
user.

Debug settings are disabled by default and can only be enabled in
the debug build.

Example of usage:
tarantool> s = box.space._session_settings
-- View session settings values.
tarantool> s:get({'sql_default_engine'})
---
- ['sql_default_engine', 'memtx']
...

tarantool> s:select()

s:select()
---
- - ['sql_default_engine', 'memtx']
  - ['sql_defer_foreign_keys', false]
  - ['sql_full_column_names', false]
  - ['sql_full_metadata', false]
  - ['sql_parser_debug', false]
  - ['sql_recursive_triggers', true]
  - ['sql_reverse_unordered_selects', false]
  - ['sql_select_debug', false]
  - ['sql_vdbe_debug', false]
...

tarantool> s:select('sql_g', {iterator='LE'})
---
- - ['sql_full_metadata', false]
  - ['sql_full_column_names', false]
  - ['sql_defer_foreign_keys', false]
  - ['sql_default_engine', 'memtx']
...

-- Change session setting value.
tarantool> s:update('sql_default_engine', {{'=', 'value', 'vinyl'}})
---
- ['sql_default_engine', 'vinyl']
...
---
 src/box/errcode.h                                  |   1 +
 src/box/session_settings.h                         |   1 +
 src/box/sql.c                                      |   5 +
 src/box/sql/build.c                                | 194 +++++++++++++++++
 ...h-4511-access-settings-from-any-frontend.result | 238 ++++++++++++++++++---
 ...4511-access-settings-from-any-frontend.test.lua | 105 +++++++--
 test/box/misc.result                               |   1 +
 7 files changed, 492 insertions(+), 53 deletions(-)

diff --git a/src/box/errcode.h b/src/box/errcode.h
index ca0cd2d..f1dde91 100644
--- a/src/box/errcode.h
+++ b/src/box/errcode.h
@@ -261,6 +261,7 @@ struct errcode_record {
 	/*206 */_(ER_SQL_PARSER_GENERIC_WITH_POS,"At line %d at or near position %d: %s") \
 	/*207 */_(ER_REPLICA_NOT_ANON, "Replica '%s' is not anonymous and cannot register.") \
 	/*208 */_(ER_CANNOT_REGISTER, "Couldn't find an instance to register this replica on.") \
+	/*209 */_(ER_SESSION_SETTING_INVALID_VALUE,	"Session setting %s expected a value of type %s") \
 
 /*
  * !IMPORTANT! Please follow instructions at start of the file
diff --git a/src/box/session_settings.h b/src/box/session_settings.h
index 7415e0e..25490a7 100644
--- a/src/box/session_settings.h
+++ b/src/box/session_settings.h
@@ -41,6 +41,7 @@
  * type list is used by setting iterators.
  */
 enum session_setting_type {
+	SESSION_SETTING_SQL,
 	session_setting_type_MAX,
 };
 
diff --git a/src/box/sql.c b/src/box/sql.c
index 7c1035c..900c716 100644
--- a/src/box/sql.c
+++ b/src/box/sql.c
@@ -63,9 +63,14 @@ static const uint32_t default_sql_flags = SQL_EnableTrigger
 					  | SQL_AutoIndex
 					  | SQL_RecTriggers;
 
+extern void
+sql_session_settings_init();
+
 void
 sql_init()
 {
+	sql_session_settings_init();
+
 	default_flags |= default_sql_flags;
 
 	current_session()->sql_flags |= default_sql_flags;
diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index 314651b..bc50ecb 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -58,6 +58,7 @@
 #include "box/coll_id_cache.h"
 #include "box/user.h"
 #include "box/constraint_id.h"
+#include "box/session_settings.h"
 
 void
 sql_finish_coding(struct Parse *parse_context)
@@ -3308,3 +3309,196 @@ sql_fieldno_by_name(struct Parse *parse_context, struct Expr *field_name,
 	*fieldno = i;
 	return 0;
 }
+
+/**
+ * Identifiers of all SQL session setings. The identifier of the
+ * option is equal to its place in the sorted list of session
+ * options of current module.
+ *
+ * It is IMPORTANT that these options are sorted by name. If this
+ * is not the case, the result returned by the _session_settings
+ * space iterator will not be sorted properly.
+ */
+enum {
+	SQL_SESSION_SETTING_DEFAULT_ENGINE = 0,
+	SQL_SESSION_SETTING_DEFER_FOREIGN_KEYS,
+	SQL_SESSION_SETTING_FULL_COLUMN_NAMES,
+	SQL_SESSION_SETTING_FULL_METADATA,
+	SQL_SESSION_SETTING_PARSER_DEBUG,
+	SQL_SESSION_SETTING_RECURSIVE_TRIGGERS,
+	SQL_SESSION_SETTING_REVERSE_UNORDERED_SELECTS,
+	SQL_SESSION_SETTING_SELECT_DEBUG,
+	SQL_SESSION_SETTING_VDBE_DEBUG,
+	sql_session_setting_MAX,
+};
+
+static const char *sql_session_setting_strs[sql_session_setting_MAX] = {
+	"sql_default_engine",
+	"sql_defer_foreign_keys",
+	"sql_full_column_names",
+	"sql_full_metadata",
+	"sql_parser_debug",
+	"sql_recursive_triggers",
+	"sql_reverse_unordered_selects",
+	"sql_select_debug",
+	"sql_vdbe_debug",
+};
+
+/**
+ * A local structure that allows to establish a connection between
+ * parameter and its field type and mask, if it has one.
+ */
+struct sql_option_metadata
+{
+	uint32_t field_type;
+	uint32_t mask;
+};
+
+/**
+ * Variable that contains SQL session option field types and masks
+ * if they have one or 0 if don't have.
+ *
+ * It is IMPORTANT that these options sorted by name.
+ */
+static struct sql_option_metadata sql_session_opts[] = {
+	/** SQL_SESSION_SETTING_DEFAULT_ENGINE */
+	{FIELD_TYPE_STRING, 0},
+	/** SQL_SESSION_SETTING_DEFER_FOREIGN_KEYS */
+	{FIELD_TYPE_BOOLEAN, SQL_DeferFKs},
+	/** SQL_SESSION_SETTING_FULL_COLUMN_NAMES */
+	{FIELD_TYPE_BOOLEAN, SQL_FullColNames},
+	/** SQL_SESSION_SETTING_FULL_METADATA */
+	{FIELD_TYPE_BOOLEAN, SQL_FullMetadata},
+	/** SQL_SESSION_SETTING_PARSER_DEBUG */
+	{FIELD_TYPE_BOOLEAN, SQL_SqlTrace | PARSER_TRACE_FLAG},
+	/** SQL_SESSION_SETTING_RECURSIVE_TRIGGERS */
+	{FIELD_TYPE_BOOLEAN, SQL_RecTriggers},
+	/** SQL_SESSION_SETTING_REVERSE_UNORDERED_SELECTS */
+	{FIELD_TYPE_BOOLEAN, SQL_ReverseOrder},
+	/** SQL_SESSION_SETTING_SELECT_DEBUG */
+	{FIELD_TYPE_BOOLEAN,
+	 SQL_SqlTrace | SQL_SelectTrace | SQL_WhereTrace},
+	/** SQL_SESSION_SETTING_VDBE_DEBUG */
+	{FIELD_TYPE_BOOLEAN,
+	 SQL_SqlTrace | SQL_VdbeListing | SQL_VdbeTrace},
+};
+
+static void
+sql_session_setting_get(int id, const char **mp_pair, const char **mp_pair_end)
+{
+	assert(id >= 0 && id < sql_session_setting_MAX);
+	struct session *session = current_session();
+	uint32_t flags = session->sql_flags;
+	struct sql_option_metadata *opt = &sql_session_opts[id];
+	uint32_t mask = opt->mask;
+	const char *name = sql_session_setting_strs[id];
+	size_t name_len = strlen(name);
+	size_t engine_len;
+	const char *engine;
+	size_t size = mp_sizeof_array(2) + mp_sizeof_str(name_len);
+	/*
+	 * Currently, SQL session settings are of a boolean or
+	 * string type.
+	 */
+	bool is_bool = opt->field_type == FIELD_TYPE_BOOLEAN;
+	if (is_bool) {
+		size += mp_sizeof_bool(true);
+	} else {
+		assert(id == SQL_SESSION_SETTING_DEFAULT_ENGINE);
+		engine = sql_storage_engine_strs[session->sql_default_engine];
+		engine_len = strlen(engine);
+		size += mp_sizeof_str(engine_len);
+	}
+
+	char *pos = static_alloc(size);
+	assert(pos != NULL);
+	char *pos_end = mp_encode_array(pos, 2);
+	pos_end = mp_encode_str(pos_end, name, name_len);
+	if (is_bool)
+		pos_end = mp_encode_bool(pos_end, (flags & mask) == mask);
+	else
+		pos_end = mp_encode_str(pos_end, engine, engine_len);
+	*mp_pair = pos;
+	*mp_pair_end = pos_end;
+}
+
+static int
+sql_set_boolean_option(int id, bool value)
+{
+	struct session *session = current_session();
+	struct sql_option_metadata *option = &sql_session_opts[id];
+	assert(option->field_type == FIELD_TYPE_BOOLEAN);
+#ifdef NDEBUG
+	if ((session->sql_flags & SQL_SqlTrace) == 0) {
+		if (value)
+			session->sql_flags |= option->mask;
+		else
+			session->sql_flags &= ~option->mask;
+	}
+#else
+	if (value)
+		session->sql_flags |= option->mask;
+	else
+		session->sql_flags &= ~option->mask;
+	if (id == SQL_SESSION_SETTING_PARSER_DEBUG) {
+		if (value)
+			sqlParserTrace(stdout, "parser: ");
+		else
+			sqlParserTrace(NULL, NULL);
+	}
+#endif
+	return 0;
+}
+
+static int
+sql_set_string_option(int id, const char *value)
+{
+	assert(sql_session_opts[id].field_type = FIELD_TYPE_STRING);
+	assert(id == SQL_SESSION_SETTING_DEFAULT_ENGINE);
+	(void)id;
+	enum sql_storage_engine engine = STR2ENUM(sql_storage_engine, value);
+	if (engine == sql_storage_engine_MAX) {
+		diag_set(ClientError, ER_NO_SUCH_ENGINE, value);
+		return -1;
+	}
+	current_session()->sql_default_engine = engine;
+	return 0;
+}
+
+static int
+sql_session_setting_set(int id, const char *mp_value)
+{
+	assert(id >= 0 && id < sql_session_setting_MAX);
+	enum mp_type mtype = mp_typeof(*mp_value);
+	enum field_type stype = sql_session_opts[id].field_type;
+	uint32_t len;
+	const char *tmp;
+	switch(stype) {
+	case FIELD_TYPE_BOOLEAN:
+		if (mtype != MP_BOOL)
+			break;
+		return sql_set_boolean_option(id, mp_decode_bool(&mp_value));
+	case FIELD_TYPE_STRING:
+		if (mtype != MP_STR)
+			break;
+		tmp = mp_decode_str(&mp_value, &len);
+		tmp = tt_cstr(tmp, len);
+		return sql_set_string_option(id, tmp);
+	default:
+		unreachable();
+	}
+	diag_set(ClientError, ER_SESSION_SETTING_INVALID_VALUE,
+		 sql_session_setting_strs[id], field_type_strs[stype]);
+	return -1;
+}
+
+void
+sql_session_settings_init()
+{
+	struct session_setting_module *module =
+		&session_setting_modules[SESSION_SETTING_SQL];
+	module->settings = sql_session_setting_strs;
+	module->setting_count = sql_session_setting_MAX;
+	module->get = sql_session_setting_get;
+	module->set = sql_session_setting_set;
+}
diff --git a/test/box/gh-4511-access-settings-from-any-frontend.result b/test/box/gh-4511-access-settings-from-any-frontend.result
index 7acdd95..64532a1 100644
--- a/test/box/gh-4511-access-settings-from-any-frontend.result
+++ b/test/box/gh-4511-access-settings-from-any-frontend.result
@@ -45,72 +45,242 @@ s:replace({'sql_defer_foreign_keys', true})
  | - error: Session_settings space does not support replace()
  | ...
 
--- Check get() and select(). They should return nothing for now.
-s:get({'a'})
+--
+-- Check select() method of session_settings space. Should work
+-- the same way as an ordinary space with an index of the type
+-- "TREE".
+--
+s:select()
  | ---
+ | - - ['sql_default_engine', 'memtx']
+ |   - ['sql_defer_foreign_keys', false]
+ |   - ['sql_full_column_names', false]
+ |   - ['sql_full_metadata', false]
+ |   - ['sql_parser_debug', false]
+ |   - ['sql_recursive_triggers', true]
+ |   - ['sql_reverse_unordered_selects', false]
+ |   - ['sql_select_debug', false]
+ |   - ['sql_vdbe_debug', false]
  | ...
-s:select()
+
+t = box.schema.space.create('settings', {format = s:format()})
+ | ---
+ | ...
+_ = t:create_index('primary')
+ | ---
+ | ...
+for _,value in s:pairs() do t:insert(value) end
+ | ---
+ | ...
+
+test_run:cmd('setopt delimiter ";"')
+ | ---
+ | - true
+ | ...
+function check_sorting(ss, ts, key)
+    local iterators_list = {'ALL', 'REQ', 'EQ', 'GE', 'GT', 'LE', 'LT'}
+    for _, it in pairs(iterators_list) do
+        local view_space = ss:select({key}, {iterator = it})
+        local test_space = ts:select({key}, {iterator = it})
+        for key, value in pairs(view_space) do
+            if test_space[key].name ~= value.name then
+                return {
+                    err = 'bad sorting', type = it,
+                    exp = test_space[key].name, got = value.name
+                }
+            end
+        end
+    end
+end;
+ | ---
+ | ...
+test_run:cmd('setopt delimiter ""');
+ | ---
+ | - true
+ | ...
+
+check_sorting(s, t)
+ | ---
+ | ...
+check_sorting(s, t, 'abcde')
+ | ---
+ | ...
+check_sorting(s, t, 'sql_d')
+ | ---
+ | ...
+check_sorting(s, t, 'sql_v')
+ | ---
+ | ...
+check_sorting(s, t, 'sql_defer_foreign_keys')
+ | ---
+ | ...
+
+t:drop()
+ | ---
+ | ...
+
+-- Check get() method of session_settings space.
+s:get({'sql_defer_foreign_keys'})
+ | ---
+ | - ['sql_defer_foreign_keys', false]
+ | ...
+s:get({'sql_recursive_triggers'})
+ | ---
+ | - ['sql_recursive_triggers', true]
+ | ...
+s:get({'sql_reverse_unordered_selects'})
+ | ---
+ | - ['sql_reverse_unordered_selects', false]
+ | ...
+s:get({'sql_default_engine'})
+ | ---
+ | - ['sql_default_engine', 'memtx']
+ | ...
+s:get({'abcd'})
  | ---
- | - []
  | ...
-s:select({}, {iterator='EQ'})
+
+-- Check pairs() method of session_settings space.
+t = {}
  | ---
- | - []
  | ...
-s:select({}, {iterator='ALL'})
+for key, value in s:pairs() do table.insert(t, {key, value}) end
  | ---
- | - []
  | ...
-s:select({}, {iterator='GE'})
+#t == s:count()
  | ---
- | - []
+ | - true
  | ...
-s:select({}, {iterator='GT'})
+
+-- Check update() method of session_settings space.
+
+-- Correct updates.
+s:update('sql_defer_foreign_keys', {{'=', 'value', true}})
  | ---
- | - []
+ | - ['sql_defer_foreign_keys', true]
  | ...
-s:select({}, {iterator='REQ'})
+s:update({'sql_defer_foreign_keys'}, {{'=', 2, false}})
  | ---
- | - []
+ | - ['sql_defer_foreign_keys', false]
  | ...
-s:select({}, {iterator='LE'})
+s:update('sql_default_engine', {{'=', 2, 'vinyl'}})
  | ---
- | - []
+ | - ['sql_default_engine', 'vinyl']
  | ...
-s:select({}, {iterator='LT'})
+s:update('sql_default_engine', {{':', 'value', 1, 5, 'memtx'}})
  | ---
- | - []
+ | - ['sql_default_engine', 'memtx']
  | ...
-s:select({'a'}, {iterator='EQ'})
+s:update('a', {{'=', 2, 1}})
  | ---
- | - []
  | ...
-s:select({'a'}, {iterator='ALL'})
+
+-- Inorrect updates.
+s:update({{'sql_defer_foreign_keys'}}, {{'=', 'value', true}})
  | ---
- | - []
+ | - error: 'Supplied key type of part 0 does not match index part type: expected string'
  | ...
-s:select({'a'}, {iterator='GE'})
+
+s:update('sql_defer_foreign_keys', {'=', 'value', true})
  | ---
- | - []
+ | - error: Illegal parameters, update operation must be an array {op,..}
  | ...
-s:select({'a'}, {iterator='GT'})
+s:update('sql_defer_foreign_keys', {{'=', 'value', true}, {'=', 2, true}})
  | ---
- | - []
+ | - ['sql_defer_foreign_keys', true]
  | ...
-s:select({'a'}, {iterator='REQ'})
+s:update('sql_defer_foreign_keys', {{}})
  | ---
- | - []
+ | - error: Illegal parameters, update operation must be an array {op,..}, got empty
+ |     array
  | ...
-s:select({'a'}, {iterator='LE'})
+s:update('sql_defer_foreign_keys', {{'='}})
  | ---
- | - []
+ | - error: Unknown UPDATE operation
  | ...
-s:select({'a'}, {iterator='LT'})
+s:update('sql_defer_foreign_keys', {{'=', 'value'}})
  | ---
- | - []
+ | - error: Unknown UPDATE operation
+ | ...
+s:update('sql_defer_foreign_keys', {{'=', 'value', true, 1}})
+ | ---
+ | - error: Unknown UPDATE operation
  | ...
 
--- Currently there is nothing to update, but update() should work.
-s:update('some_option', {{'=', 'value', true}})
+s:update('sql_defer_foreign_keys', {{'+', 'value', 2}})
+ | ---
+ | - error: 'Argument type in operation ''+'' on field ''value'' does not match field
+ |     type: expected a number'
+ | ...
+s:update('sql_defer_foreign_keys', {{'-', 'value', 2}})
+ | ---
+ | - error: 'Argument type in operation ''-'' on field ''value'' does not match field
+ |     type: expected a number'
+ | ...
+s:update('sql_defer_foreign_keys', {{'&', 'value', 2}})
+ | ---
+ | - error: 'Argument type in operation ''&'' on field ''value'' does not match field
+ |     type: expected a positive integer'
+ | ...
+s:update('sql_defer_foreign_keys', {{'|', 'value', 2}})
+ | ---
+ | - error: 'Argument type in operation ''|'' on field ''value'' does not match field
+ |     type: expected a positive integer'
+ | ...
+s:update('sql_defer_foreign_keys', {{'^', 'value', 2}})
+ | ---
+ | - error: 'Argument type in operation ''^'' on field ''value'' does not match field
+ |     type: expected a positive integer'
+ | ...
+s:update('sql_defer_foreign_keys', {{'!', 'value', 2}})
+ | ---
+ | - error: Tuple field count 3 does not match space field count 2
+ | ...
+s:update('sql_defer_foreign_keys', {{'#', 'value', 2}})
+ | ---
+ | - error: Tuple field count 1 does not match space field count 2
+ | ...
+s:update('sql_defer_foreign_keys', {{1, 'value', true}})
+ | ---
+ | - error: Illegal parameters, update operation name must be a string
+ | ...
+s:update('sql_defer_foreign_keys', {{{1}, 'value', true}})
+ | ---
+ | - error: Illegal parameters, update operation name must be a string
+ | ...
+
+s:update('sql_defer_foreign_keys', {{'=', {'value'}, true}})
+ | ---
+ | - error: Illegal parameters, field id must be a number or a string
+ | ...
+s:update('sql_defer_foreign_keys', {{'=', 1, 'new_key'}})
+ | ---
+ | - error: Attempt to modify a tuple field which is part of index 'primary' in space
+ |     '_session_settings'
+ | ...
+s:update('sql_defer_foreign_keys', {{'=', 'name', 'new_key'}})
+ | ---
+ | - error: Attempt to modify a tuple field which is part of index 'primary' in space
+ |     '_session_settings'
+ | ...
+s:update('sql_defer_foreign_keys', {{'=', 3, true}})
+ | ---
+ | - error: Tuple field count 3 does not match space field count 2
+ | ...
+s:update('sql_defer_foreign_keys', {{'=', 'some text', true}})
+ | ---
+ | - error: Field 'some text' was not found in the tuple
+ | ...
+
+s:update('sql_defer_foreign_keys', {{'=', 'value', 1}})
+ | ---
+ | - error: Session setting sql_defer_foreign_keys expected a value of type boolean
+ | ...
+s:update('sql_defer_foreign_keys', {{'=', 'value', {1}}})
+ | ---
+ | - error: Session setting sql_defer_foreign_keys expected a value of type boolean
+ | ...
+s:update('sql_defer_foreign_keys', {{'=', 'value', '1'}})
  | ---
+ | - error: Session setting sql_defer_foreign_keys expected a value of type boolean
  | ...
diff --git a/test/box/gh-4511-access-settings-from-any-frontend.test.lua b/test/box/gh-4511-access-settings-from-any-frontend.test.lua
index d27fec3..3668749 100644
--- a/test/box/gh-4511-access-settings-from-any-frontend.test.lua
+++ b/test/box/gh-4511-access-settings-from-any-frontend.test.lua
@@ -19,23 +19,90 @@ s:insert({'a', 1})
 s:delete({'b'})
 s:replace({'sql_defer_foreign_keys', true})
 
--- Check get() and select(). They should return nothing for now.
-s:get({'a'})
+--
+-- Check select() method of session_settings space. Should work
+-- the same way as an ordinary space with an index of the type
+-- "TREE".
+--
 s:select()
-s:select({}, {iterator='EQ'})
-s:select({}, {iterator='ALL'})
-s:select({}, {iterator='GE'})
-s:select({}, {iterator='GT'})
-s:select({}, {iterator='REQ'})
-s:select({}, {iterator='LE'})
-s:select({}, {iterator='LT'})
-s:select({'a'}, {iterator='EQ'})
-s:select({'a'}, {iterator='ALL'})
-s:select({'a'}, {iterator='GE'})
-s:select({'a'}, {iterator='GT'})
-s:select({'a'}, {iterator='REQ'})
-s:select({'a'}, {iterator='LE'})
-s:select({'a'}, {iterator='LT'})
-
--- Currently there is nothing to update, but update() should work.
-s:update('some_option', {{'=', 'value', true}})
+
+t = box.schema.space.create('settings', {format = s:format()})
+_ = t:create_index('primary')
+for _,value in s:pairs() do t:insert(value) end
+
+test_run:cmd('setopt delimiter ";"')
+function check_sorting(ss, ts, key)
+    local iterators_list = {'ALL', 'REQ', 'EQ', 'GE', 'GT', 'LE', 'LT'}
+    for _, it in pairs(iterators_list) do
+        local view_space = ss:select({key}, {iterator = it})
+        local test_space = ts:select({key}, {iterator = it})
+        for key, value in pairs(view_space) do
+            if test_space[key].name ~= value.name then
+                return {
+                    err = 'bad sorting', type = it,
+                    exp = test_space[key].name, got = value.name
+                }
+            end
+        end
+    end
+end;
+test_run:cmd('setopt delimiter ""');
+
+check_sorting(s, t)
+check_sorting(s, t, 'abcde')
+check_sorting(s, t, 'sql_d')
+check_sorting(s, t, 'sql_v')
+check_sorting(s, t, 'sql_defer_foreign_keys')
+
+t:drop()
+
+-- Check get() method of session_settings space.
+s:get({'sql_defer_foreign_keys'})
+s:get({'sql_recursive_triggers'})
+s:get({'sql_reverse_unordered_selects'})
+s:get({'sql_default_engine'})
+s:get({'abcd'})
+
+-- Check pairs() method of session_settings space.
+t = {}
+for key, value in s:pairs() do table.insert(t, {key, value}) end
+#t == s:count()
+
+-- Check update() method of session_settings space.
+
+-- Correct updates.
+s:update('sql_defer_foreign_keys', {{'=', 'value', true}})
+s:update({'sql_defer_foreign_keys'}, {{'=', 2, false}})
+s:update('sql_default_engine', {{'=', 2, 'vinyl'}})
+s:update('sql_default_engine', {{':', 'value', 1, 5, 'memtx'}})
+s:update('a', {{'=', 2, 1}})
+
+-- Inorrect updates.
+s:update({{'sql_defer_foreign_keys'}}, {{'=', 'value', true}})
+
+s:update('sql_defer_foreign_keys', {'=', 'value', true})
+s:update('sql_defer_foreign_keys', {{'=', 'value', true}, {'=', 2, true}})
+s:update('sql_defer_foreign_keys', {{}})
+s:update('sql_defer_foreign_keys', {{'='}})
+s:update('sql_defer_foreign_keys', {{'=', 'value'}})
+s:update('sql_defer_foreign_keys', {{'=', 'value', true, 1}})
+
+s:update('sql_defer_foreign_keys', {{'+', 'value', 2}})
+s:update('sql_defer_foreign_keys', {{'-', 'value', 2}})
+s:update('sql_defer_foreign_keys', {{'&', 'value', 2}})
+s:update('sql_defer_foreign_keys', {{'|', 'value', 2}})
+s:update('sql_defer_foreign_keys', {{'^', 'value', 2}})
+s:update('sql_defer_foreign_keys', {{'!', 'value', 2}})
+s:update('sql_defer_foreign_keys', {{'#', 'value', 2}})
+s:update('sql_defer_foreign_keys', {{1, 'value', true}})
+s:update('sql_defer_foreign_keys', {{{1}, 'value', true}})
+
+s:update('sql_defer_foreign_keys', {{'=', {'value'}, true}})
+s:update('sql_defer_foreign_keys', {{'=', 1, 'new_key'}})
+s:update('sql_defer_foreign_keys', {{'=', 'name', 'new_key'}})
+s:update('sql_defer_foreign_keys', {{'=', 3, true}})
+s:update('sql_defer_foreign_keys', {{'=', 'some text', true}})
+
+s:update('sql_defer_foreign_keys', {{'=', 'value', 1}})
+s:update('sql_defer_foreign_keys', {{'=', 'value', {1}}})
+s:update('sql_defer_foreign_keys', {{'=', 'value', '1'}})
diff --git a/test/box/misc.result b/test/box/misc.result
index 705f849..132df37 100644
--- a/test/box/misc.result
+++ b/test/box/misc.result
@@ -557,6 +557,7 @@ t;
   206: box.error.SQL_PARSER_GENERIC_WITH_POS
   207: box.error.REPLICA_NOT_ANON
   208: box.error.CANNOT_REGISTER
+  209: box.error.SESSION_SETTING_INVALID_VALUE
 ...
 test_run:cmd("setopt delimiter ''");
 ---
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 8/9] sql: remove control pragmas
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
                   ` (6 preceding siblings ...)
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 7/9] box: add SQL settings to _session_settings imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 9/9] sql: refactor PRAGMA-related code imeevma
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

This patch removes control pragmas. They are not needed now, after
the introduction of the _session_settings system space.

Closes #4511
---
 src/box/sql/pragma.c                               | 192 +--------------------
 src/box/sql/pragma.h                               | 125 --------------
 src/box/sql/sqlInt.h                               |   3 -
 src/box/sql/util.c                                 |  15 --
 src/box/sql/vdbe.c                                 |   4 +-
 src/box/sql/vdbe.h                                 |   5 -
 src/box/sql/vdbeaux.c                              |  18 --
 test/box/sql-update-with-nested-select.result      |   2 -
 test/box/sql-update-with-nested-select.test.lua    |   3 -
 test/sql-tap/autoinc.test.lua                      |   3 +-
 test/sql-tap/colname.test.lua                      |  14 +-
 test/sql-tap/fkey2.test.lua                        |   4 +-
 test/sql-tap/lua/sqltester.lua                     |   2 +-
 test/sql-tap/misc1.test.lua                        |   2 +-
 test/sql-tap/pragma.test.lua                       | 135 +--------------
 test/sql-tap/select1.test.lua                      |  42 ++---
 test/sql-tap/tkt3731.test.lua                      |   2 +-
 test/sql-tap/trigger2.test.lua                     |   3 +-
 test/sql-tap/triggerC.test.lua                     |  65 +------
 test/sql-tap/whereA.test.lua                       |  24 ++-
 test/sql/check-clear-ephemeral.result              |   5 +-
 test/sql/check-clear-ephemeral.test.lua            |   5 +-
 test/sql/checks.result                             |  10 +-
 test/sql/checks.test.lua                           |   4 +-
 test/sql/clear.result                              |   5 +-
 test/sql/clear.test.lua                            |   5 +-
 test/sql/collation.result                          |   3 +-
 test/sql/collation.test.lua                        |   2 +-
 test/sql/constraint.result                         |   3 +-
 test/sql/constraint.test.lua                       |   2 +-
 test/sql/ddl.result                                |   3 +-
 test/sql/ddl.test.lua                              |   2 +-
 test/sql/delete-multiple-idx.result                |   5 +-
 test/sql/delete-multiple-idx.test.lua              |   5 +-
 test/sql/delete.result                             |   5 +-
 test/sql/delete.test.lua                           |   5 +-
 test/sql/drop-index.result                         |   5 +-
 test/sql/drop-index.test.lua                       |   5 +-
 test/sql/drop-table.result                         |   5 +-
 test/sql/drop-table.test.lua                       |   5 +-
 test/sql/engine.cfg                                |   3 -
 test/sql/engine.result                             |  12 +-
 test/sql/engine.test.lua                           |   6 +-
 test/sql/errinj.result                             |   3 +-
 test/sql/errinj.test.lua                           |   2 +-
 test/sql/full_metadata.result                      |   8 +-
 test/sql/full_metadata.test.lua                    |   4 +-
 test/sql/func-recreate.result                      |   3 +-
 test/sql/func-recreate.test.lua                    |   2 +-
 test/sql/gh-2362-select-access-rights.result       |   5 +-
 test/sql/gh-2362-select-access-rights.test.lua     |   2 +-
 test/sql/gh-2929-primary-key.result                |   3 +-
 test/sql/gh-2929-primary-key.test.lua              |   2 +-
 test/sql/gh-2981-check-autoinc.result              |   3 +-
 test/sql/gh-2981-check-autoinc.test.lua            |   2 +-
 test/sql/gh-3199-no-mem-leaks.result               |   3 +-
 test/sql/gh-3199-no-mem-leaks.test.lua             |   2 +-
 test/sql/gh-3613-idx-alter-update-2.result         |   3 +-
 test/sql/gh-3613-idx-alter-update-2.test.lua       |   2 +-
 test/sql/gh-3613-idx-alter-update.result           |   3 +-
 test/sql/gh-3613-idx-alter-update.test.lua         |   2 +-
 test/sql/gh-3888-values-blob-assert.result         |   3 +-
 test/sql/gh-3888-values-blob-assert.test.lua       |   2 +-
 test/sql/gh2141-delete-trigger-drop-table.result   |   3 +-
 test/sql/gh2141-delete-trigger-drop-table.test.lua |   2 +-
 test/sql/gh2251-multiple-update.result             |   3 +-
 test/sql/gh2251-multiple-update.test.lua           |   2 +-
 test/sql/gh2483-remote-persistency-check.result    |   3 +-
 test/sql/gh2483-remote-persistency-check.test.lua  |   2 +-
 .../gh2808-inline-unique-persistency-check.result  |   3 +-
 ...gh2808-inline-unique-persistency-check.test.lua |   2 +-
 test/sql/icu-upper-lower.result                    |   3 +-
 test/sql/icu-upper-lower.test.lua                  |   2 +-
 test/sql/insert-unique.result                      |   5 +-
 test/sql/insert-unique.test.lua                    |   5 +-
 test/sql/integer-overflow.result                   |   3 +-
 test/sql/integer-overflow.test.lua                 |   2 +-
 test/sql/iproto.result                             |   3 +-
 test/sql/iproto.test.lua                           |   2 +-
 test/sql/max-on-index.result                       |   5 +-
 test/sql/max-on-index.test.lua                     |   5 +-
 test/sql/message-func-indexes.result               |   3 +-
 test/sql/message-func-indexes.test.lua             |   2 +-
 test/sql/misc.result                               |   3 +-
 test/sql/misc.test.lua                             |   2 +-
 test/sql/no-pk-space.result                        |   3 +-
 test/sql/no-pk-space.test.lua                      |   2 +-
 test/sql/on-conflict.result                        |   3 +-
 test/sql/on-conflict.test.lua                      |   2 +-
 test/sql/persistency.result                        |   3 +-
 test/sql/persistency.test.lua                      |   2 +-
 test/sql/row-count.result                          |  11 +-
 test/sql/row-count.test.lua                        |   4 +-
 test/sql/savepoints.result                         |   3 +-
 test/sql/savepoints.test.lua                       |   2 +-
 test/sql/select-null.result                        |   5 +-
 test/sql/select-null.test.lua                      |   5 +-
 test/sql/sql-debug.result                          |  54 ------
 test/sql/sql-debug.test.lua                        |  17 --
 test/sql/sql-statN-index-drop.test.lua             |   2 +-
 test/sql/suite.ini                                 |   2 +-
 test/sql/tokenizer.result                          |   3 +-
 test/sql/tokenizer.test.lua                        |   2 +-
 test/sql/transition.result                         |   3 +-
 test/sql/transition.test.lua                       |   2 +-
 test/sql/transitive-transactions.result            |   9 +-
 test/sql/transitive-transactions.test.lua          |   9 +-
 test/sql/triggers.result                           |  27 ++-
 test/sql/triggers.test.lua                         |  14 +-
 test/sql/update-with-nested-select.result          |   5 +-
 test/sql/update-with-nested-select.test.lua        |   5 +-
 test/sql/upgrade.result                            |   3 +-
 test/sql/upgrade.test.lua                          |   2 +-
 test/sql/view.result                               |   3 +-
 test/sql/view.test.lua                             |   2 +-
 test/sql/view_delayed_wal.result                   |   3 +-
 test/sql/view_delayed_wal.test.lua                 |   2 +-
 test/sql/vinyl-opts.result                         |   4 +-
 test/sql/vinyl-opts.test.lua                       |   2 +-
 119 files changed, 189 insertions(+), 928 deletions(-)
 delete mode 100644 test/sql/sql-debug.result
 delete mode 100644 test/sql/sql-debug.test.lua

diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
index a8353ba..ee1348c 100644
--- a/src/box/sql/pragma.c
+++ b/src/box/sql/pragma.c
@@ -62,56 +62,6 @@
 #include "pragma.h"
 #include "tarantoolInt.h"
 
-/*
- * Interpret the given string as a safety level.  Return 0 for OFF,
- * 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA.  Return 1 for an empty or
- * unrecognized string argument.  The FULL and EXTRA option is disallowed
- * if the omitFull parameter it 1.
- *
- * Note that the values returned are one less that the values that
- * should be passed into sqlBtreeSetSafetyLevel().  The is done
- * to support legacy SQL code.  The safety level used to be boolean
- * and older scripts may have used numbers 0 for OFF and 1 for ON.
- */
-static u8
-getSafetyLevel(const char *z, int omitFull, u8 dflt)
-{
-	/* 123456789 123456789 123 */
-	static const char zText[] = "onoffalseyestruextrafull";
-	static const u8 iOffset[] = { 0, 1, 2, 4, 9, 12, 15, 20 };
-	static const u8 iLength[] = { 2, 2, 3, 5, 3, 4, 5, 4 };
-	static const u8 iValue[] = { 1, 0, 0, 0, 1, 1, 3, 2 };
-	/* on no off false yes true extra full */
-	int i, n;
-	if (sqlIsdigit(*z)) {
-		return (u8) sqlAtoi(z);
-	}
-	n = sqlStrlen30(z);
-	for (i = 0; i < ArraySize(iLength); i++) {
-		if (iLength[i] == n
-		    && sqlStrNICmp(&zText[iOffset[i]], z, n) == 0
-		    && (!omitFull || iValue[i] <= 1)
-		    ) {
-			return iValue[i];
-		}
-	}
-	return dflt;
-}
-
-/*
- * Interpret the given string as a boolean value.
- */
-u8
-sqlGetBoolean(const char *z, u8 dflt)
-{
-	return getSafetyLevel(z, 1, dflt) != 0;
-}
-
-/* The sqlGetBoolean() function is used by other modules but the
- * remainder of this file is specific to PRAGMA processing.  So omit
- * the rest of the file if PRAGMAs are omitted from the build.
- */
-
 /** Set result column names and types for a pragma. */
 static void
 vdbe_set_pragma_result_columns(struct Vdbe *v, const struct PragmaName *pragma)
@@ -126,17 +76,6 @@ vdbe_set_pragma_result_columns(struct Vdbe *v, const struct PragmaName *pragma)
 }
 
 /*
- * Generate code to return a single integer value.
- */
-static void
-returnSingleInt(Vdbe * v, i64 value)
-{
-	sqlVdbeAddOp4Dup8(v, OP_Int64, 0, 1, 0, (const u8 *)&value,
-			  value < 0 ? P4_INT64 : P4_UINT64);
-	sqlVdbeAddOp2(v, OP_ResultRow, 1, 1);
-}
-
-/*
  * Locate a pragma in the aPragmaName[] array.
  */
 static const PragmaName *
@@ -159,53 +98,6 @@ pragmaLocate(const char *zName)
 	return lwr > upr ? 0 : &aPragmaName[mid];
 }
 
-static void
-vdbe_emit_pragma_status(struct Parse *parse)
-{
-	struct Vdbe *v = sqlGetVdbe(parse);
-	struct session *user_session = current_session();
-
-	sqlVdbeSetNumCols(v, 2);
-	vdbe_metadata_set_col_name(v, 0, "pragma_name");
-	vdbe_metadata_set_col_type(v, 0, "text");
-	vdbe_metadata_set_col_name(v, 1, "pragma_value");
-	vdbe_metadata_set_col_type(v, 1, "integer");
-
-	parse->nMem = 2;
-	for (int i = 0; i < ArraySize(aPragmaName); ++i) {
-		if (aPragmaName[i].ePragTyp != PragTyp_FLAG)
-			continue;
-		sqlVdbeAddOp4(v, OP_String8, 0, 1, 0, aPragmaName[i].zName, 0);
-		int val = (user_session->sql_flags & aPragmaName[i].iArg) != 0;
-		sqlVdbeAddOp2(v, OP_Integer, val, 2);
-		sqlVdbeAddOp2(v, OP_ResultRow, 1, 2);
-	}
-}
-
-/**
- * Set tarantool backend default engine for SQL interface.
- * @param engine_name to set default.
- * @retval -1 on error.
- * @retval 0 on success.
- */
-static int
-sql_default_engine_set(const char *engine_name)
-{
-	if (engine_name == NULL) {
-		diag_set(ClientError, ER_ILLEGAL_PARAMS,
-			 "'sql_default_engine' was not specified");
-		return -1;
-	}
-	enum sql_storage_engine engine =
-		STR2ENUM(sql_storage_engine, engine_name);
-	if (engine == sql_storage_engine_MAX) {
-		diag_set(ClientError, ER_NO_SUCH_ENGINE, engine_name);
-		return -1;
-	}
-	current_session()->sql_default_engine = engine;
-	return 0;
-}
-
 /**
  * This function handles PRAGMA TABLE_INFO(<table>).
  *
@@ -371,22 +263,6 @@ sql_pragma_index_list(struct Parse *parse, const char *tbl_name)
 }
 
 /*
- * @brief Check whether the specified token is a string or ID.
- * @param token - token to be examined
- * @return true - if the token value is enclosed into quotes (')
- * @return false in other cases
- * The empty value is considered to be a string.
- */
-static bool
-token_is_string(const struct Token* token)
-{
-	if (!token || token->n == 0)
-		return true;
-	return token->n >= 2 && token->z[0] == '\'' &&
-	       token->z[token->n - 1] == '\'';
-}
-
-/*
  * Process a pragma statement.
  *
  * Pragmas are of this form:
@@ -414,17 +290,12 @@ sqlPragma(Parse * pParse, Token * pId,	/* First part of [schema.]id field */
 	sql *db = pParse->db;	/* The database connection */
 	Vdbe *v = sqlGetVdbe(pParse);	/* Prepared statement */
 	const PragmaName *pPragma;	/* The pragma */
-	struct session *user_session = current_session();
 
 	if (v == 0)
 		return;
 	sqlVdbeRunOnlyOnce(v);
 	pParse->nMem = 2;
 
-	if (pId == NULL) {
-		vdbe_emit_pragma_status(pParse);
-		return;
-	}
 	zLeft = sql_name_from_token(db, pId);
 	if (zLeft == NULL) {
 		pParse->is_aborted = true;
@@ -454,38 +325,10 @@ sqlPragma(Parse * pParse, Token * pId,	/* First part of [schema.]id field */
 		goto pragma_out;
 	}
 	/* Register the result column names for pragmas that return results */
-	if ((pPragma->mPragFlg & PragFlg_NoColumns) == 0 &&
-	    ((pPragma->mPragFlg & PragFlg_NoColumns1) == 0 || zRight == NULL))
-		vdbe_set_pragma_result_columns(v, pPragma);
+	vdbe_set_pragma_result_columns(v, pPragma);
 	/* Jump to the appropriate pragma handler */
 	switch (pPragma->ePragTyp) {
 
-	case PragTyp_FLAG:{
-		if (zRight == NULL) {
-			vdbe_set_pragma_result_columns(v, pPragma);
-			returnSingleInt(v, (user_session->sql_flags &
-					    pPragma->iArg) != 0);
-		} else {
-			/* Mask of bits to set or clear. */
-			int mask = pPragma->iArg;
-			bool is_pragma_set = sqlGetBoolean(zRight, 0);
-
-			if (is_pragma_set)
-				user_session->sql_flags |= mask;
-			else
-				user_session->sql_flags &= ~mask;
-#if defined(SQL_DEBUG)
-			if (mask == PARSER_TRACE_FLAG) {
-				if (is_pragma_set)
-					sqlParserTrace(stdout, "parser: ");
-				else
-					sqlParserTrace(0, 0);
-			}
-#endif
-		}
-		break;
-	}
-
 	case PragTyp_TABLE_INFO:
 		sql_pragma_table_info(pParse, zRight);
 		break;
@@ -563,43 +406,10 @@ sqlPragma(Parse * pParse, Token * pId,	/* First part of [schema.]id field */
 		break;
 	}
 
-	case PragTyp_DEFAULT_ENGINE: {
-		if (!token_is_string(pValue)) {
-			diag_set(ClientError, ER_ILLEGAL_PARAMS,
-				 "string value is expected");
-			pParse->is_aborted = true;
-			goto pragma_out;
-		}
-		if (zRight == NULL) {
-			const char *engine_name =
-				sql_storage_engine_strs[current_session()->
-							sql_default_engine];
-			sqlVdbeLoadString(v, 1, engine_name);
-			sqlVdbeAddOp2(v, OP_ResultRow, 1, 1);
-		} else {
-			if (sql_default_engine_set(zRight) != 0) {
-				pParse->is_aborted = true;
-				goto pragma_out;
-			}
-			sqlVdbeAddOp0(v, OP_Expire);
-		}
-		break;
-	}
-
 	default:
 		unreachable();
 	}			/* End of the PRAGMA switch */
 
-	/* The following block is a no-op unless SQL_DEBUG is
-	 * defined. Its only * purpose is to execute assert()
-	 * statements to verify that if the * PragFlg_NoColumns1 flag
-	 * is set and the caller specified an argument * to the PRAGMA,
-	 * the implementation has not added any OP_ResultRow *
-	 * instructions to the VM.
-	 */
-	if ((pPragma->mPragFlg & PragFlg_NoColumns1) && zRight) {
-		sqlVdbeVerifyNoResultRow(v);
-	}
  pragma_out:
 	sqlDbFree(db, zLeft);
 	sqlDbFree(db, zRight);
diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h
index 05c913d..6c66d97 100644
--- a/src/box/sql/pragma.h
+++ b/src/box/sql/pragma.h
@@ -6,18 +6,14 @@
 
 /* The various pragma types */
 #define PragTyp_COLLATION_LIST                 3
-#define PragTyp_FLAG                           5
 #define PragTyp_FOREIGN_KEY_LIST               9
 #define PragTyp_INDEX_INFO                    10
 #define PragTyp_INDEX_LIST                    11
 #define PragTyp_STATS                         15
 #define PragTyp_TABLE_INFO                    17
-#define PragTyp_DEFAULT_ENGINE                25
 
 /* Property flags associated with various pragma. */
 #define PragFlg_NeedSchema 0x01	/* Force schema load before running */
-#define PragFlg_NoColumns  0x02	/* OP_ResultRow called with zero columns */
-#define PragFlg_NoColumns1 0x04	/* zero columns if RHS argument is present */
 #define PragFlg_Result0    0x10	/* Acts as query when no argument */
 #define PragFlg_Result1    0x20	/* Acts as query when has one argument */
 #define PragFlg_SchemaOpt  0x40	/* Schema restricts name search if present */
@@ -92,48 +88,6 @@ static const char *const pragCName[] = {
 	/*  55 */ "text",
 	/*  56 */ "match",
 	/*  57 */ "text",
-	/* Used by: defer_foreign_keys */
-	/*  58 */ "defer_foreign_keys",
-	/*  59 */ "integer",
-	/* Used by: full_column_names */
-	/*  60 */ "full_column_names",
-	/*  61 */ "integer",
-	/* Used by: parser_trace */
-	/*  62 */ "parser_trace",
-	/*  63 */ "integer",
-	/* Used by: recursive_triggers */
-	/*  64 */ "recursive_triggers",
-	/*  65 */ "integer",
-	/* Used by: reverse_unordered_selects */
-	/*  66 */ "reverse_unordered_selects",
-	/*  67 */ "integer",
-	/* Used by: select_trace */
-	/*  68 */ "select_trace",
-	/*  69 */ "integer",
-	/* Used by: sql_default_engine */
-	/*  70 */ "sql_default_engine",
-	/*  71 */ "text",
-	/* Used by: sql_trace */
-	/*  72 */ "sql_trace",
-	/*  73 */ "integer",
-	/* Used by: vdbe_debug */
-	/*  74 */ "vdbe_debug",
-	/*  75 */ "integer",
-	/* Used by: vdbe_eqp */
-	/*  76 */ "vdbe_eqp",
-	/*  77 */ "integer",
-	/* Used by: vdbe_listing */
-	/*  78 */ "vdbe_listing",
-	/*  79 */ "integer",
-	/* Used by: vdbe_trace */
-	/*  80 */ "vdbe_trace",
-	/*  81 */ "integer",
-	/* Used by: where_trace */
-	/*  82 */ "where_trace",
-	/*  83 */ "integer",
-	/* Used by: full_metadata */
-	/*  84 */ "full_metadata",
-	/*  85 */ "integer",
 };
 
 /* Definitions of all built-in pragmas */
@@ -155,27 +109,12 @@ static const PragmaName aPragmaName[] = {
 	 /* ePragFlg:  */ PragFlg_Result0,
 	 /* ColNames:  */ 38, 2,
 	 /* iArg:      */ 0},
-	{ /* zName:     */ "defer_foreign_keys",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 58, 1,
-	 /* iArg:      */ SQL_DeferFKs},
 	{ /* zName:     */ "foreign_key_list",
 	 /* ePragTyp:  */ PragTyp_FOREIGN_KEY_LIST,
 	 /* ePragFlg:  */
 	 PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt,
 	 /* ColNames:  */ 42, 8,
 	 /* iArg:      */ 0},
-	{ /* zName:     */ "full_column_names",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 60, 1,
-	 /* iArg:      */ SQL_FullColNames},
-	{ /* zName:     */ "full_metadata",
-	  /* ePragTyp:  */ PragTyp_FLAG,
-	  /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	  /* ColNames:  */ 84, 1,
-	  /* iArg:      */ SQL_FullMetadata},
 	{ /* zName:     */ "index_info",
 	 /* ePragTyp:  */ PragTyp_INDEX_INFO,
 	 /* ePragFlg:  */
@@ -188,42 +127,6 @@ static const PragmaName aPragmaName[] = {
 	 PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt,
 	 /* ColNames:  */ 32, 3,
 	 /* iArg:      */ 0},
-#if defined(SQL_DEBUG)
-	{ /* zName:     */ "parser_trace",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 62, 1,
-	 /* iArg:      */ PARSER_TRACE_FLAG},
-#endif
-	{ /* zName:     */ "recursive_triggers",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 64, 1,
-	 /* iArg:      */ SQL_RecTriggers},
-	{ /* zName:     */ "reverse_unordered_selects",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 66, 1,
-	 /* iArg:      */ SQL_ReverseOrder},
-#if defined(SQL_DEBUG)
-	{ /* zName:     */ "select_trace",
-	/* ePragTyp:  */ PragTyp_FLAG,
-	/* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	/* ColNames:  */ 68, 1,
-	/* iArg:      */ SQL_SelectTrace},
-#endif
-	{ /* zName:     */ "sql_default_engine",
-	 /* ePragTyp:  */ PragTyp_DEFAULT_ENGINE,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 70, 1,
-	 /* iArg:      */ 0},
-#if defined(SQL_DEBUG)
-	{ /* zName:     */ "sql_trace",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 72, 1,
-	 /* iArg:      */ SQL_SqlTrace},
-#endif
 	{ /* zName:     */ "stats",
 	 /* ePragTyp:  */ PragTyp_STATS,
 	 /* ePragFlg:  */
@@ -236,33 +139,5 @@ static const PragmaName aPragmaName[] = {
 	 PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt,
 	 /* ColNames:  */ 0, 6,
 	 /* iArg:      */ 0},
-#if defined(SQL_DEBUG)
-	{ /* zName:     */ "vdbe_debug",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 74, 1,
-	 /* iArg:      */
-	 SQL_SqlTrace | SQL_VdbeListing | SQL_VdbeTrace},
-	{ /* zName:     */ "vdbe_eqp",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 76, 1,
-	 /* iArg:      */ SQL_VdbeEQP},
-	{ /* zName:     */ "vdbe_listing",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 78, 1,
-	 /* iArg:      */ SQL_VdbeListing},
-	{ /* zName:     */ "vdbe_trace",
-	 /* ePragTyp:  */ PragTyp_FLAG,
-	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	 /* ColNames:  */ 80, 1,
-	 /* iArg:      */ SQL_VdbeTrace},
-	{ /* zName:     */ "where_trace",
-	/* ePragTyp:  */ PragTyp_FLAG,
-	/* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
-	/* ColNames:  */ 82, 1,
-	/* iArg:      */ SQL_WhereTrace},
-#endif
 };
 /* Number of pragmas: 36 on by default, 47 total. */
diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h
index 09748a6..15dc374 100644
--- a/src/box/sql/sqlInt.h
+++ b/src/box/sql/sqlInt.h
@@ -3793,7 +3793,6 @@ sql_space_def_check_format(const struct space_def *space_def);
 void sqlDetach(Parse *, Expr *);
 int sqlAtoF(const char *z, double *, int);
 int sqlGetInt32(const char *, int *);
-int sqlAtoi(const char *);
 
 /**
  * Return number of symbols in the given string.
@@ -3981,8 +3980,6 @@ int
 sql_rem_int(int64_t lhs, bool is_lhs_neg, int64_t rhs, bool is_rhs_neg,
 	    int64_t *res, bool *is_res_neg);
 
-u8 sqlGetBoolean(const char *z, u8);
-
 const void *sqlValueText(sql_value *);
 int sqlValueBytes(sql_value *);
 void sqlValueSetStr(sql_value *, int, const void *,
diff --git a/src/box/sql/util.c b/src/box/sql/util.c
index 0e115ac..f908e9c 100644
--- a/src/box/sql/util.c
+++ b/src/box/sql/util.c
@@ -495,8 +495,6 @@ sql_atoi64(const char *z, int64_t *val, bool *is_neg, int length)
  * This routine accepts both decimal and hexadecimal notation for integers.
  *
  * Any non-numeric characters that following zNum are ignored.
- * This is different from sqlAtoi64() which requires the
- * input number to be zero-terminated.
  */
 int
 sqlGetInt32(const char *zNum, int *pValue)
@@ -554,19 +552,6 @@ sqlGetInt32(const char *zNum, int *pValue)
 }
 
 /*
- * Return a 32-bit integer value extracted from a string.  If the
- * string is not an integer, just return 0.
- */
-int
-sqlAtoi(const char *z)
-{
-	int x = 0;
-	if (z)
-		sqlGetInt32(z, &x);
-	return x;
-}
-
-/*
  * The variable-length integer encoding is as follows:
  *
  * KEY:
diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
index b821d9d..eab74db 100644
--- a/src/box/sql/vdbe.c
+++ b/src/box/sql/vdbe.c
@@ -4782,8 +4782,8 @@ case OP_Program: {        /* jump */
 
 	/* If the p5 flag is clear, then recursive invocation of triggers is
 	 * disabled for backwards compatibility (p5 is set if this sub-program
-	 * is really a trigger, not a foreign key action, and the flag set
-	 * and cleared by the "PRAGMA recursive_triggers" command is clear).
+	 * is really a trigger, not a foreign key action, and the setting
+	 * 'recursive_triggers' is not set).
 	 *
 	 * It is recursive invocation of triggers, at the SQL level, that is
 	 * disabled. In some cases a single trigger may generate more than one
diff --git a/src/box/sql/vdbe.h b/src/box/sql/vdbe.h
index de080cd..48815d4 100644
--- a/src/box/sql/vdbe.h
+++ b/src/box/sql/vdbe.h
@@ -199,11 +199,6 @@ int sqlVdbeAddOp4(Vdbe *, int, int, int, int, const char *zP4, int);
 int sqlVdbeAddOp4Dup8(Vdbe *, int, int, int, int, const u8 *, int);
 int sqlVdbeAddOp4Int(Vdbe *, int, int, int, int, int);
 void sqlVdbeEndCoroutine(Vdbe *, int);
-#if defined(SQL_DEBUG) && !defined(SQL_TEST_REALLOC_STRESS)
-void sqlVdbeVerifyNoResultRow(Vdbe * p);
-#else
-#define sqlVdbeVerifyNoResultRow(A)
-#endif
 void sqlVdbeChangeOpcode(Vdbe *, u32 addr, u8);
 void sqlVdbeChangeP1(Vdbe *, u32 addr, int P1);
 void sqlVdbeChangeP2(Vdbe *, u32 addr, int P2);
diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
index c63472c..b88726e 100644
--- a/src/box/sql/vdbeaux.c
+++ b/src/box/sql/vdbeaux.c
@@ -519,24 +519,6 @@ sqlVdbeCurrentAddr(Vdbe * p)
 }
 
 /*
- * Verify that the VM passed as the only argument does not contain
- * an OP_ResultRow opcode. Fail an assert() if it does. This is used
- * by code in pragma.c to ensure that the implementation of certain
- * pragmas comports with the flags specified in the mkpragmatab.tcl
- * script.
- */
-#if defined(SQL_DEBUG) && !defined(SQL_TEST_REALLOC_STRESS)
-void
-sqlVdbeVerifyNoResultRow(Vdbe * p)
-{
-	int i;
-	for (i = 0; i < p->nOp; i++) {
-		assert(p->aOp[i].opcode != OP_ResultRow);
-	}
-}
-#endif
-
-/*
  * This function returns a pointer to the array of opcodes associated with
  * the Vdbe passed as the first argument. It is the callers responsibility
  * to arrange for the returned array to be eventually freed using the
diff --git a/test/box/sql-update-with-nested-select.result b/test/box/sql-update-with-nested-select.result
index 4ff090f..cfcc28f 100644
--- a/test/box/sql-update-with-nested-select.result
+++ b/test/box/sql-update-with-nested-select.result
@@ -7,8 +7,6 @@ box.execute("CREATE TABLE t1(a integer primary key, b int UNIQUE, e int);");
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 -- Seed entries
 box.execute("INSERT INTO t1 VALUES(1,4,6);");
 ---
diff --git a/test/box/sql-update-with-nested-select.test.lua b/test/box/sql-update-with-nested-select.test.lua
index 5c5dd96..c15b0de 100644
--- a/test/box/sql-update-with-nested-select.test.lua
+++ b/test/box/sql-update-with-nested-select.test.lua
@@ -5,9 +5,6 @@ test_run = require('test_run').new()
 -- create space
 box.execute("CREATE TABLE t1(a integer primary key, b int UNIQUE, e int);");
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
-
 -- Seed entries
 box.execute("INSERT INTO t1 VALUES(1,4,6);");
 box.execute("INSERT INTO t1 VALUES(2,5,7);");
diff --git a/test/sql-tap/autoinc.test.lua b/test/sql-tap/autoinc.test.lua
index 6105db3..37e65e5 100755
--- a/test/sql-tap/autoinc.test.lua
+++ b/test/sql-tap/autoinc.test.lua
@@ -640,7 +640,8 @@ test:do_test(
         -- </autoinc-10.3>
     })
 
-test:catchsql(" pragma recursive_triggers = off ")
+box.space._session_settings:update('sql_recursive_triggers', {{'=', 2, false}})
+
 -- Ticket #3928.  Make sure that triggers to not make extra slots in
 -- the sql_SEQUENCE table.
 --
diff --git a/test/sql-tap/colname.test.lua b/test/sql-tap/colname.test.lua
index de03d7c..caa61a0 100755
--- a/test/sql-tap/colname.test.lua
+++ b/test/sql-tap/colname.test.lua
@@ -45,12 +45,12 @@ end
 test:do_test(
     "colname-1.1",
     function()
-        return test:execsql "PRAGMA full_column_names"
-    end, {
+        return box.space._session_settings:get("sql_full_column_names").value
+    end,
         -- <colname-1.2>
-        0
+        false
         -- </colname-1.2>
-    })
+    )
 
 -- Tests for then short=ON and full=any
 --
@@ -163,7 +163,7 @@ test:do_test(
     "colname-3.1",
     function()
         test:execsql [[
-            PRAGMA full_column_names='OFF';
+            UPDATE "_session_settings" SET "value" = false WHERE "name" = 'sql_full_column_names';
             CREATE VIEW v3 AS SELECT tabC.a, txyZ.x, *
               FROM tabc, txyz ORDER BY 1 LIMIT 1;
             CREATE VIEW v4 AS SELECT tabC.a, txyZ.x, tboTh.a, tbotH.x, * 
@@ -283,7 +283,7 @@ test:do_test(
     "colname-4.1",
     function()
         test:execsql [[
-            PRAGMA full_column_names='ON';
+            UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_full_column_names';
             CREATE VIEW v5 AS SELECT tabC.a, txyZ.x, *
               FROM tabc, txyz ORDER BY 1 LIMIT 1;
             CREATE VIEW v6 AS SELECT tabC.a, txyZ.x, tboTh.a, tbotH.x, * 
@@ -440,7 +440,7 @@ test:do_test(
         -- instead of reconnect to database
         -- we are just turning settings to default state
         test:execsql([[
-            PRAGMA full_column_names='OFF';
+            UPDATE "_session_settings" SET "value" = false WHERE "name" = 'sql_full_column_names';
             ]])
         test:execsql [=[
             CREATE TABLE t6(a INT primary key, "'a'" INT, """a""" INT, "[a]" INT,  "`a`" INT);
diff --git a/test/sql-tap/fkey2.test.lua b/test/sql-tap/fkey2.test.lua
index 264616d..bd3e0c7 100755
--- a/test/sql-tap/fkey2.test.lua
+++ b/test/sql-tap/fkey2.test.lua
@@ -450,7 +450,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "fkey2-4.2",
     [[
-        PRAGMA recursive_triggers = off;
+        UPDATE "_session_settings" SET "value" = false WHERE "name" = 'sql_recursive_triggers';
         DELETE FROM t1 WHERE node = 1;
         SELECT node FROM t1;
     ]], {
@@ -473,7 +473,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "fkey2-4.4",
     [[
-        PRAGMA recursive_triggers = on;
+        UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_recursive_triggers';
         DROP TABLE t2;
         DROP TABLE t1;
         CREATE TABLE t1(
diff --git a/test/sql-tap/lua/sqltester.lua b/test/sql-tap/lua/sqltester.lua
index 0f34114..9b0218e 100644
--- a/test/sql-tap/lua/sqltester.lua
+++ b/test/sql-tap/lua/sqltester.lua
@@ -413,7 +413,7 @@ box.cfg{
 }
 
 local engine = test_run and test_run:get_cfg('engine') or 'memtx'
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 function test.engine(self)
     return engine
diff --git a/test/sql-tap/misc1.test.lua b/test/sql-tap/misc1.test.lua
index b47dbf0..32f38cc 100755
--- a/test/sql-tap/misc1.test.lua
+++ b/test/sql-tap/misc1.test.lua
@@ -219,7 +219,7 @@ test:do_test(
         local r = test:execsql([[
             CREATE TABLE t1(a TEXT primary KEY);
             INSERT INTO t1 VALUES('hi');
-            PRAGMA full_column_names=on;
+            UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_full_column_names';
             --SELECT rowid, * FROM t1;
             SELECT * FROM t1;
         ]])
diff --git a/test/sql-tap/pragma.test.lua b/test/sql-tap/pragma.test.lua
index c36f9b9..d6f8b54 100755
--- a/test/sql-tap/pragma.test.lua
+++ b/test/sql-tap/pragma.test.lua
@@ -1,7 +1,7 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
 
-test:plan(23)
+test:plan(10)
 
 test:do_catchsql_test(
 	"pragma-1.3",
@@ -19,66 +19,7 @@ test:do_catchsql_test(
 	[[
 		pragma sql_default_engine='creepy';
 	]], {
-	1, "Space engine 'creepy' does not exist"
-})
-
-test:do_catchsql_test(
-	"pragma-2.2",
-	[[
-		pragma sql_default_engine='vinyl';
-	]], {
-	0
-})
-
-test:do_catchsql_test(
-	"pragma-2.3",
-	[[
-		pragma sql_default_engine='memtx';
-	]], {
-	0
-})
-
-test:do_catchsql_test(
-	"pragma-2.4",
-	[[
-		pragma sql_default_engine 'memtx';
-	]], {
-	1, "Syntax error at line 1 near ''memtx''"
-})
-
-test:do_catchsql_test(
-	"pragma-2.5",
-	[[
-		pragma sql_default_engine 1;
-	]], {
-	1, "Syntax error at line 1 near '1'"
-})
-
---
--- gh-3832: Some statements do not return column type
---
--- Check that "PRAGMA sql_default_engine" called without arguments
--- returns currently set sql_default_engine.
-test:do_execsql_test(
-	"pragma-3.1",
-	[[
-		pragma sql_default_engine='vinyl';
-		pragma sql_default_engine;
-	]], {
-	-- <pragma-3.1>
-	'vinyl'
-	-- </pragma-3.1>
-})
-
-test:do_execsql_test(
-	"pragma-3.2",
-	[[
-		pragma sql_default_engine='memtx';
-		pragma sql_default_engine;
-	]], {
-	-- <pragma-3.2>
-	'memtx'
-	-- </pragma-3.2>
+	1, "Pragma 'SQL_DEFAULT_ENGINE' does not exist"
 })
 
 --
@@ -187,76 +128,4 @@ test:do_execsql_test(
 	-- </pragma-8.4>
 })
 
----
---- pragma sql_default_engine accepts string values and rejects IDs
----
-test:do_catchsql_test(
-	"pragma-9.1",
-	[[
-		pragma sql_default_engine(the_engine);
-	]], {
-	-- <pragma-9.1>
-	1, "Illegal parameters, string value is expected"
-	-- </pragma-9.1>
-})
-
-test:do_catchsql_test(
-	"pragma-9.2",
-	[[
-		pragma sql_default_engine(THE_ENGINE);
-	]], {
-	-- <pragma-9.2>
-	1, "Illegal parameters, string value is expected"
-	-- </pragma-9.2>
-})
-
-test:do_catchsql_test(
-	"pragma-9.3",
-	[[
-		pragma sql_default_engine("THE_ENGINE");
-	]], {
-	-- <pragma-9.3>
-	1, "Illegal parameters, string value is expected"
-	-- </pragma-9.3>
-})
-
-test:do_catchsql_test(
-	"pragma-9.4",
-	[[
-		pragma sql_default_engine('THE_ENGINE');
-	]], {
-	-- <pragma-9.4>
-	1, "Space engine 'THE_ENGINE' does not exist"
-	-- </pragma-9.4>
-})
-
-test:do_catchsql_test(
-	"pragma-9.5",
-	[[
-		pragma sql_default_engine(memtx);
-	]], {
-	-- <pragma-9.5>
-	1, "Illegal parameters, string value is expected"
-	-- </pragma-9.5>
-})
-
-test:do_catchsql_test(
-	"pragma-9.6",
-	[[
-		pragma sql_default_engine("memtx");
-	]], {
-	-- <pragma-9.6>
-	1, "Illegal parameters, string value is expected"
-	-- </pragma-9.6>
-})
-
-test:do_execsql_test(
-	"pragma-9.7",
-	[[
-		pragma sql_default_engine('memtx');
-	]], {
-	-- <pragma-9.7>
-	-- </pragma-9.7>
-})
-
 test:finish_test()
diff --git a/test/sql-tap/select1.test.lua b/test/sql-tap/select1.test.lua
index 7029d27..fbebfab 100755
--- a/test/sql-tap/select1.test.lua
+++ b/test/sql-tap/select1.test.lua
@@ -2,6 +2,12 @@
 test = require("sqltester")
 test:plan(173)
 
+function set_full_column_names(value)
+    box.space._session_settings:update('sql_full_column_names', {
+        {'=', 2, value}
+    })
+end
+
 --!./tcltestrunner.lua
 -- ["set","testdir",[["file","dirname",["argv0"]]]]
 -- ["source",[["testdir"],"\/tester.tcl"]]
@@ -916,7 +922,7 @@ test:do_catchsql2_test(
 test:do_test(
     "select1-6.1.1",
     function()
-        test:execsql "PRAGMA full_column_names=on"
+        set_full_column_names(true)
         return test:catchsql2 "SELECT f1 FROM test1 ORDER BY f2"
     end, {
         -- <select1-6.1.1>
@@ -952,7 +958,7 @@ test:do_test(
             msg = test:execsql2 "SELECT DISTINCT * FROM test1 WHERE f1==11"
             end)
         v = v == true and {0} or {1} 
-        test:execsql "PRAGMA full_column_names=off"
+        set_full_column_names(false)
         return table.insert(v,msg) or v
     end, {
         -- <select1-6.1.4>
@@ -1043,13 +1049,13 @@ test:do_catchsql2_test(
 test:do_test(
     "select1-6.5.1",
     function()
-        test:execsql2 "PRAGMA full_column_names=on"
+        set_full_column_names(true)
         local msg
         v = pcall( function ()
                 msg = test:execsql2 "SELECT test1.f1+F2 FROM test1 ORDER BY f2"
             end)
         v = v == true and {0} or {1}
-        test:execsql2 "PRAGMA full_column_names=off"
+        set_full_column_names(false)
         return table.insert(v,msg) or v
     end, {
         -- <select1-6.5.1>
@@ -1123,9 +1129,7 @@ test:do_catchsql2_test(
 test:do_test(
     "select1-6.9.3",
     function()
-        test:execsql [[
-            PRAGMA full_column_names='OFF';
-        ]]
+        set_full_column_names(false)
         return test:execsql2 [[
             SELECT test1 . f1, test1 . f2 FROM test1 LIMIT 1
         ]]
@@ -1138,9 +1142,7 @@ test:do_test(
 test:do_test(
     "select1-6.9.4",
     function()
-        test:execsql [[
-            PRAGMA full_column_names='ON';
-        ]]
+        set_full_column_names(true)
         return test:execsql2 [[
             SELECT test1 . f1, test1 . f2 FROM test1 LIMIT 1
         ]]
@@ -1153,9 +1155,7 @@ test:do_test(
 test:do_test(
     "select1-6.9.5",
     function()
-        test:execsql [[
-            PRAGMA full_column_names='ON';
-        ]]
+        set_full_column_names(true)
         return test:execsql2 [[
             SELECT 123.45;
         ]]
@@ -1234,9 +1234,7 @@ test:do_execsql2_test(
 test:do_test(
     "select1-6.9.11",
     function()
-        test:execsql [[
-            PRAGMA full_column_names='ON';
-        ]]
+        set_full_column_names(true)
         return test:execsql2 [[
             SELECT a.f1, b.f2 FROM test1 a, test1 b LIMIT 1
         ]]
@@ -1259,9 +1257,7 @@ test:do_execsql2_test(
 test:do_test(
     "select1-6.9.13",
     function()
-        test:execsql [[
-            PRAGMA full_column_names='OFF';
-        ]]
+        set_full_column_names(false)
         return test:execsql2 [[
             SELECT a.f1, b.f1 FROM test1 a, test1 b LIMIT 1
         ]]
@@ -1284,9 +1280,7 @@ test:do_execsql2_test(
 test:do_test(
     "select1-6.9.15",
     function()
-        test:execsql [[
-            PRAGMA full_column_names='ON';
-        ]]
+        set_full_column_names(true)
         return test:execsql2 [[
             SELECT a.f1, b.f1 FROM test1 a, test1 b LIMIT 1
         ]]
@@ -1306,9 +1300,7 @@ test:do_execsql2_test(
         -- </select1-6.9.16>
     })
 
-test:execsql [[
-    PRAGMA full_column_names='OFF';
-]]
+set_full_column_names(false)
 test:do_catchsql2_test(
         "select1-6.10",
         [[
diff --git a/test/sql-tap/tkt3731.test.lua b/test/sql-tap/tkt3731.test.lua
index 454cf67..092e8bf 100755
--- a/test/sql-tap/tkt3731.test.lua
+++ b/test/sql-tap/tkt3731.test.lua
@@ -22,7 +22,7 @@ test:plan(3)
 -- The tests in this file were written before sql supported recursive
 -- trigger invocation, and some tests depend on that to pass. So disable
 -- recursive triggers for this file.
-test:catchsql " pragma recursive_triggers = off "
+box.space._session_settings:update('sql_recursive_triggers', {{'=', 2, false}})
 test:do_execsql_test(
     "tkt3731-1.1",
     [[
diff --git a/test/sql-tap/trigger2.test.lua b/test/sql-tap/trigger2.test.lua
index 6e60050..192b707 100755
--- a/test/sql-tap/trigger2.test.lua
+++ b/test/sql-tap/trigger2.test.lua
@@ -58,7 +58,8 @@ test:plan(26)
 -- The tests in this file were written before sql supported recursive
 -- trigger invocation, and some tests depend on that to pass. So disable
 -- recursive triggers for this file.
-test:catchsql " pragma recursive_triggers = off "
+
+box.space._session_settings:update('sql_recursive_triggers', {{'=', 2, false}})
 -- 1.
 ii = 0
 tbl_definitions = { "CREATE TABLE tbl (id INT PRIMARY KEY AUTOINCREMENT, a INTEGER UNIQUE, b INT );",
diff --git a/test/sql-tap/triggerC.test.lua b/test/sql-tap/triggerC.test.lua
index cf7dd7b..ef4d69d 100755
--- a/test/sql-tap/triggerC.test.lua
+++ b/test/sql-tap/triggerC.test.lua
@@ -1,6 +1,6 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
-test:plan(48)
+test:plan(43)
 
 --!./tcltestrunner.lua
 -- 2009 August 24
@@ -36,12 +36,9 @@ testprefix = "triggerC"
 --               REPLACE conflict resolution. And that they are not fired
 --               if recursive triggers are not enabled.
 --
--- triggerC-6.*: Test that the recursive_triggers pragma returns correct
---               results when invoked without an argument.
---
 -- Enable recursive triggers for this file.
 --
-test:execsql " PRAGMA recursive_triggers = on "
+box.space._session_settings:update('sql_recursive_triggers', {{'=', 2, true}})
 ---------------------------------------------------------------------------
 -- This block of tests, triggerC-1.*, are not aimed at any specific
 -- property of the triggers sub-system. They were created to debug
@@ -501,15 +498,6 @@ test:do_execsql_test(
 --     "
 --   } [concat $t5g $t5]
 -- }
-test:do_execsql_test(
-    "triggerC-5.3.0",
-    [[
-        PRAGMA recursive_triggers = off
-    ]], {
-        -- <triggerC-5.3.0>
-
-        -- </triggerC-5.3.0>
-    })
 
 -- MUST_WORK_TEST
 -- foreach {n dml t5g t5} {
@@ -531,51 +519,6 @@ test:do_execsql_test(
 --     "
 --   } [concat $t5g $t5]
 -- }
-test:do_execsql_test(
-    "triggerC-5.3.8",
-    [[
-        PRAGMA recursive_triggers = on
-    ]], {
-        -- <triggerC-5.3.8>
-
-        -- </triggerC-5.3.8>
-    })
-
----------------------------------------------------------------------------
--- This block of tests, triggerC-6.*, tests that "PRAGMA recursive_triggers"
--- statements return the current value of the recursive triggers flag.
---
-test:do_execsql_test(
-    "triggerC-6.1",
-    [[
-        PRAGMA recursive_triggers
-    ]], {
-        -- <triggerC-6.1>
-        1
-        -- </triggerC-6.1>
-    })
-
-test:do_execsql_test(
-    "triggerC-6.2",
-    [[
-        PRAGMA recursive_triggers = off;
-        PRAGMA recursive_triggers;
-    ]], {
-        -- <triggerC-6.2>
-        0
-        -- </triggerC-6.2>
-    })
-
-test:do_execsql_test(
-    "triggerC-6.3",
-    [[
-        PRAGMA recursive_triggers = on;
-        PRAGMA recursive_triggers;
-    ]], {
-        -- <triggerC-6.3>
-        1
-        -- </triggerC-6.3>
-    })
 
 -- MUST_WORK_TEST
 -- #-------------------------------------------------------------------------
@@ -890,7 +833,7 @@ test:execsql(
 test:do_execsql_test(
     "triggerC-13.1",
     [[
-        PRAGMA recursive_triggers = 'ON';
+        UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_recursive_triggers';
         CREATE TABLE t12(id INTEGER PRIMARY KEY, a INT, b INT);
         INSERT INTO t12 VALUES(1, 1, 2);
         CREATE TRIGGER tr12 AFTER UPDATE ON t12 FOR EACH ROW BEGIN
@@ -974,7 +917,7 @@ test:do_execsql_test(
 test:do_execsql_test(
     "triggerC-15.1.1",
     [[
-        PRAGMA recursive_triggers = 1;
+        UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_recursive_triggers';
         CREATE TABLE node(
             id int not null primary key,
             pid int not null default 0,
diff --git a/test/sql-tap/whereA.test.lua b/test/sql-tap/whereA.test.lua
index b82575f..a49d1c0 100755
--- a/test/sql-tap/whereA.test.lua
+++ b/test/sql-tap/whereA.test.lua
@@ -39,7 +39,7 @@ test:do_test(
     "whereA-1.2",
     function()
         return test:execsql [[
-            PRAGMA reverse_unordered_selects=1;
+            UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_reverse_unordered_selects';
             SELECT * FROM t1;
         ]]
     end, {
@@ -55,7 +55,7 @@ test:do_test(
         --db close
         --sql db test.db
         return test:execsql [[
-            PRAGMA reverse_unordered_selects=1;
+            UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_reverse_unordered_selects';
             SELECT * FROM t1;
         ]]
     end, {
@@ -75,14 +75,12 @@ test:do_test(
 test:do_test(
     "whereA-1.6",
     function()
-        return test:execsql [[
-            PRAGMA reverse_unordered_selects;
-        ]]
-    end, {
+        return box.space._session_settings:get('sql_reverse_unordered_selects').value
+    end,
         -- <whereA-1.6>
-        1
+        true
         -- </whereA-1.6>
-    })
+    )
 
 test:do_execsql_test(
     "whereA-1.8",
@@ -108,7 +106,7 @@ test:do_test(
     "whereA-2.1",
     function()
         return test:execsql [[
-            PRAGMA reverse_unordered_selects=0;
+            UPDATE "_session_settings" SET "value" = false WHERE "name" = 'sql_reverse_unordered_selects';
             SELECT * FROM t1 WHERE a>0;
         ]]
     end, {
@@ -121,7 +119,7 @@ test:do_test(
     "whereA-2.2",
     function()
         return test:execsql [[
-            PRAGMA reverse_unordered_selects=1;
+            UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_reverse_unordered_selects';
             SELECT * FROM t1 WHERE a>0;
         ]]
     end, {
@@ -140,7 +138,7 @@ test:do_test(
     "whe:reA-3.1",
     function()
         return test:execsql [[
-            PRAGMA reverse_unordered_selects=0;
+            UPDATE "_session_settings" SET "value" = false WHERE "name" = 'sql_reverse_unordered_selects';
             SELECT * FROM t1 WHERE b>0;
         ]]
     end, {
@@ -153,7 +151,7 @@ test:do_test(
     "whereA-3.2",
     function()
         return test:execsql [[
-            PRAGMA reverse_unordered_selects=1;
+            UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_reverse_unordered_selects';
             SELECT * FROM t1 WHERE b>0;
         ]]
     end, {
@@ -166,7 +164,7 @@ test:do_test(
     "whereA-3.3",
     function()
         return test:execsql [[
-            PRAGMA reverse_unordered_selects=1;
+            UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_reverse_unordered_selects';
             SELECT * FROM t1 WHERE b>0 ORDER BY b;
         ]]
     end, {
diff --git a/test/sql/check-clear-ephemeral.result b/test/sql/check-clear-ephemeral.result
index 7d0be5f..ba28b50 100644
--- a/test/sql/check-clear-ephemeral.result
+++ b/test/sql/check-clear-ephemeral.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -14,8 +13,6 @@ box.execute("CREATE TABLE t1(a INT,b INT,c INT,PRIMARY KEY(b,c));")
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 -- Seed entries
 box.execute("WITH RECURSIVE cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x<1000) INSERT INTO t1 SELECT x, x%40, x/40 FROM cnt;")
 ---
diff --git a/test/sql/check-clear-ephemeral.test.lua b/test/sql/check-clear-ephemeral.test.lua
index 929a6c9..694d9a8 100644
--- a/test/sql/check-clear-ephemeral.test.lua
+++ b/test/sql/check-clear-ephemeral.test.lua
@@ -1,14 +1,11 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 -- box.cfg()
 
 -- create space
 box.execute("CREATE TABLE t1(a INT,b INT,c INT,PRIMARY KEY(b,c));")
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
-
 -- Seed entries
 box.execute("WITH RECURSIVE cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x<1000) INSERT INTO t1 SELECT x, x%40, x/40 FROM cnt;")
 
diff --git a/test/sql/checks.result b/test/sql/checks.result
index 23edd03..4ae0b4c 100644
--- a/test/sql/checks.result
+++ b/test/sql/checks.result
@@ -11,9 +11,8 @@ test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua...\"]:<line>: '")
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 --
 -- gh-3272: Move SQL CHECK into server
@@ -733,13 +732,6 @@ physics_ck:drop()
 -- Make sure that ck constraints are turned on/off with
 -- :enable configurator.
 --
-engine = test_run:get_cfg('engine')
----
-...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
----
-- row_count: 0
-...
 box.execute("CREATE TABLE test(a INT PRIMARY KEY);");
 ---
 - row_count: 1
diff --git a/test/sql/checks.test.lua b/test/sql/checks.test.lua
index 4d33823..301f8ea 100644
--- a/test/sql/checks.test.lua
+++ b/test/sql/checks.test.lua
@@ -2,7 +2,7 @@ env = require('test_run')
 test_run = env.new()
 test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua...\"]:<line>: '")
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 --
 -- gh-3272: Move SQL CHECK into server
@@ -239,8 +239,6 @@ physics_ck:drop()
 -- Make sure that ck constraints are turned on/off with
 -- :enable configurator.
 --
-engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
 box.execute("CREATE TABLE test(a INT PRIMARY KEY);");
 box.execute('ALTER TABLE test ADD CONSTRAINT CK CHECK(a < 5);')
 box.space.TEST:insert({10})
diff --git a/test/sql/clear.result b/test/sql/clear.result
index e7c4985..62715ec 100644
--- a/test/sql/clear.result
+++ b/test/sql/clear.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -18,8 +17,6 @@ box.execute("CREATE UNIQUE INDEX zoobar2 ON zoobar(c1, c4)")
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON;")
 -- Seed entry
 for i=1, 100 do box.execute(string.format("INSERT INTO zoobar VALUES (%d, %d, 'c3', 444)", i+i, i)) end
 ---
diff --git a/test/sql/clear.test.lua b/test/sql/clear.test.lua
index 4c58767..d099de5 100644
--- a/test/sql/clear.test.lua
+++ b/test/sql/clear.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
@@ -8,9 +8,6 @@ box.execute('pragma sql_default_engine=\''..engine..'\'')
 box.execute("CREATE TABLE zoobar (c1 INT, c2 INT PRIMARY KEY, c3 TEXT, c4 INT)")
 box.execute("CREATE UNIQUE INDEX zoobar2 ON zoobar(c1, c4)")
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON;")
-
 -- Seed entry
 for i=1, 100 do box.execute(string.format("INSERT INTO zoobar VALUES (%d, %d, 'c3', 444)", i+i, i)) end
 
diff --git a/test/sql/collation.result b/test/sql/collation.result
index f8696b6..4e43a7c 100644
--- a/test/sql/collation.result
+++ b/test/sql/collation.result
@@ -7,9 +7,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- gh-3010: COLLATE after LIMIT should throw an error
 -- All of these tests should throw error "near "COLLATE": syntax error"
diff --git a/test/sql/collation.test.lua b/test/sql/collation.test.lua
index a013253..9a2042c 100644
--- a/test/sql/collation.test.lua
+++ b/test/sql/collation.test.lua
@@ -1,7 +1,7 @@
 remote = require('net.box')
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- gh-3010: COLLATE after LIMIT should throw an error
 
diff --git a/test/sql/constraint.result b/test/sql/constraint.result
index 3000a92..1585c23 100644
--- a/test/sql/constraint.result
+++ b/test/sql/constraint.result
@@ -5,9 +5,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
  | ---
  | ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
  | ---
- | - row_count: 0
  | ...
 
 --
diff --git a/test/sql/constraint.test.lua b/test/sql/constraint.test.lua
index 2f367ea..163f430 100755
--- a/test/sql/constraint.test.lua
+++ b/test/sql/constraint.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 --
 -- Check a constraint name for duplicate within a single
diff --git a/test/sql/ddl.result b/test/sql/ddl.result
index 28acf37..aecd57a 100644
--- a/test/sql/ddl.result
+++ b/test/sql/ddl.result
@@ -8,9 +8,8 @@ json = require('json')
 engine = test_run:get_cfg('engine')
  | ---
  | ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
  | ---
- | - row_count: 0
  | ...
 
 --
diff --git a/test/sql/ddl.test.lua b/test/sql/ddl.test.lua
index 6067b61..b99a520 100644
--- a/test/sql/ddl.test.lua
+++ b/test/sql/ddl.test.lua
@@ -1,7 +1,7 @@
 test_run = require('test_run').new()
 json = require('json')
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 --
 -- gh-4086: SQL transactional DDL.
diff --git a/test/sql/delete-multiple-idx.result b/test/sql/delete-multiple-idx.result
index ca58feb..b517b5d 100644
--- a/test/sql/delete-multiple-idx.result
+++ b/test/sql/delete-multiple-idx.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- Create space.
@@ -18,8 +17,6 @@ box.execute("CREATE UNIQUE INDEX t3y ON t3(y);");
 ---
 - row_count: 1
 ...
--- Debug.
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 -- Seed entries.
 box.execute("INSERT INTO t3 VALUES (1, 1, NULL);");
 ---
diff --git a/test/sql/delete-multiple-idx.test.lua b/test/sql/delete-multiple-idx.test.lua
index a81cccc..2ca07da 100644
--- a/test/sql/delete-multiple-idx.test.lua
+++ b/test/sql/delete-multiple-idx.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
@@ -8,9 +8,6 @@ box.execute('pragma sql_default_engine=\''..engine..'\'')
 box.execute("CREATE TABLE t3(id INT primary key,x INT,y INT);");
 box.execute("CREATE UNIQUE INDEX t3y ON t3(y);");
 
--- Debug.
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
-
 -- Seed entries.
 box.execute("INSERT INTO t3 VALUES (1, 1, NULL);");
 box.execute("INSERT INTO t3 VALUES(2,9,NULL);");
diff --git a/test/sql/delete.result b/test/sql/delete.result
index e27c79d..8c53342 100644
--- a/test/sql/delete.result
+++ b/test/sql/delete.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -14,8 +13,6 @@ box.execute("CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a, b));");
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 -- Seed entries
 box.execute("INSERT INTO t1 VALUES(1, 2);");
 ---
diff --git a/test/sql/delete.test.lua b/test/sql/delete.test.lua
index 75448d4..130a8ed 100644
--- a/test/sql/delete.test.lua
+++ b/test/sql/delete.test.lua
@@ -1,15 +1,12 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
 -- create space
 box.execute("CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a, b));");
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
-
 -- Seed entries
 box.execute("INSERT INTO t1 VALUES(1, 2);");
 box.execute("INSERT INTO t1 VALUES(2, 4);");
diff --git a/test/sql/drop-index.result b/test/sql/drop-index.result
index e8eb642..0c7fe80 100644
--- a/test/sql/drop-index.result
+++ b/test/sql/drop-index.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -22,8 +21,6 @@ box.execute("CREATE        INDEX zoobar3 ON zzoobar(c3)")
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zzoobar VALUES (111, 222, 'c3', 444)")
 -- Dummy entry
 box.execute("INSERT INTO zzoobar VALUES (111, 222, 'c3', 444)")
 ---
diff --git a/test/sql/drop-index.test.lua b/test/sql/drop-index.test.lua
index 8cd86ee..13cd6be 100644
--- a/test/sql/drop-index.test.lua
+++ b/test/sql/drop-index.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
@@ -10,9 +10,6 @@ box.execute("CREATE TABLE zzoobar (c1 NUMBER, c2 INT PRIMARY KEY, c3 TEXT, c4 NU
 box.execute("CREATE UNIQUE INDEX zoobar2 ON zzoobar(c1, c4)")
 box.execute("CREATE        INDEX zoobar3 ON zzoobar(c3)")
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zzoobar VALUES (111, 222, 'c3', 444)")
-
 -- Dummy entry
 box.execute("INSERT INTO zzoobar VALUES (111, 222, 'c3', 444)")
 
diff --git a/test/sql/drop-table.result b/test/sql/drop-table.result
index 7bc073d..807b42c 100644
--- a/test/sql/drop-table.result
+++ b/test/sql/drop-table.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -14,8 +13,6 @@ box.execute("CREATE TABLE zzzoobar (c1 INT, c2 INT PRIMARY KEY, c3 TEXT, c4 INT)
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zzzoobar VALUES (111, 222, 'c3', 444)")
 box.execute("CREATE INDEX zb ON zzzoobar(c1, c3)")
 ---
 - row_count: 1
diff --git a/test/sql/drop-table.test.lua b/test/sql/drop-table.test.lua
index a310db1..19ee639 100644
--- a/test/sql/drop-table.test.lua
+++ b/test/sql/drop-table.test.lua
@@ -1,15 +1,12 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
 -- create space
 box.execute("CREATE TABLE zzzoobar (c1 INT, c2 INT PRIMARY KEY, c3 TEXT, c4 INT)")
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zzzoobar VALUES (111, 222, 'c3', 444)")
-
 box.execute("CREATE INDEX zb ON zzzoobar(c1, c3)")
 
 -- Dummy entry
diff --git a/test/sql/engine.cfg b/test/sql/engine.cfg
index efc42a1..a97f60a 100644
--- a/test/sql/engine.cfg
+++ b/test/sql/engine.cfg
@@ -2,9 +2,6 @@
     "vinyl-opts.test.lua" : {
         "vinyl": {"engine": "vinyl"}
     },
-    "sql-debug.test.lua": {
-        "memtx": {"engine": "memtx"}
-    },
     "bind.test.lua": {
         "remote": {"remote": "true"},
         "local": {"remote": "false"}
diff --git a/test/sql/engine.result b/test/sql/engine.result
index ff87129..a246677 100644
--- a/test/sql/engine.result
+++ b/test/sql/engine.result
@@ -4,9 +4,9 @@ env = require('test_run')
 test_run = env.new()
 ---
 ...
-box.execute("pragma sql_default_engine='vinyl'")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'vinyl']
 ...
 box.execute("CREATE TABLE t1_vinyl(a INT PRIMARY KEY, b INT, c INT);")
 ---
@@ -16,9 +16,9 @@ box.execute("CREATE TABLE t2_vinyl(a INT PRIMARY KEY, b INT, c INT);")
 ---
 - row_count: 1
 ...
-box.execute("pragma sql_default_engine='memtx'")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'memtx'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'memtx']
 ...
 box.execute("CREATE TABLE t3_memtx(a INT PRIMARY KEY, b INT, c INT);")
 ---
@@ -66,9 +66,9 @@ assert(box.space.T1_MEMTX.engine == 'memtx')
 ---
 - true
 ...
-box.execute("pragma sql_default_engine='vinyl'")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'vinyl']
 ...
 box.execute("CREATE TABLE t2_vinyl (id INT PRIMARY KEY) WITH ENGINE = 'vinyl'")
 ---
diff --git a/test/sql/engine.test.lua b/test/sql/engine.test.lua
index 112d3d3..d71cbc1 100644
--- a/test/sql/engine.test.lua
+++ b/test/sql/engine.test.lua
@@ -1,11 +1,11 @@
 env = require('test_run')
 test_run = env.new()
 
-box.execute("pragma sql_default_engine='vinyl'")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 box.execute("CREATE TABLE t1_vinyl(a INT PRIMARY KEY, b INT, c INT);")
 box.execute("CREATE TABLE t2_vinyl(a INT PRIMARY KEY, b INT, c INT);")
 
-box.execute("pragma sql_default_engine='memtx'")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'memtx'}})
 box.execute("CREATE TABLE t3_memtx(a INT PRIMARY KEY, b INT, c INT);")
 
 assert(box.space.T1_VINYL.engine == 'vinyl')
@@ -22,7 +22,7 @@ box.execute("CREATE TABLE t1_vinyl (id INT PRIMARY KEY) WITH ENGINE = 'vinyl'")
 assert(box.space.T1_VINYL.engine == 'vinyl')
 box.execute("CREATE TABLE t1_memtx (id INT PRIMARY KEY) WITH ENGINE = 'memtx'")
 assert(box.space.T1_MEMTX.engine == 'memtx')
-box.execute("pragma sql_default_engine='vinyl'")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 box.execute("CREATE TABLE t2_vinyl (id INT PRIMARY KEY) WITH ENGINE = 'vinyl'")
 assert(box.space.T2_VINYL.engine == 'vinyl')
 box.execute("CREATE TABLE t2_memtx (id INT PRIMARY KEY) WITH ENGINE = 'memtx'")
diff --git a/test/sql/errinj.result b/test/sql/errinj.result
index 7ab522f..68c001f 100644
--- a/test/sql/errinj.result
+++ b/test/sql/errinj.result
@@ -7,9 +7,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 errinj = box.error.injection
 ---
diff --git a/test/sql/errinj.test.lua b/test/sql/errinj.test.lua
index b978767..72e96a9 100644
--- a/test/sql/errinj.test.lua
+++ b/test/sql/errinj.test.lua
@@ -1,7 +1,7 @@
 remote = require('net.box')
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 errinj = box.error.injection
 fiber = require('fiber')
 
diff --git a/test/sql/full_metadata.result b/test/sql/full_metadata.result
index ca69f41..5a93c41 100644
--- a/test/sql/full_metadata.result
+++ b/test/sql/full_metadata.result
@@ -46,9 +46,9 @@ test_run:cmd("setopt delimiter ''");
  | - true
  | ...
 
-execute("PRAGMA full_metadata = true;")
+execute([[UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_full_metadata';]])
  | ---
- | - row_count: 0
+ | - row_count: 1
  | ...
 -- Make sure collation is presented in extended metadata.
 --
@@ -204,9 +204,9 @@ execute("SELECT x, y FROM v;")
  |   - [2, 1]
  | ...
 
-execute("PRAGMA full_metadata = false;")
+execute([[UPDATE "_session_settings" SET "value" = false WHERE "name" = 'sql_full_metadata';]])
  | ---
- | - row_count: 0
+ | - row_count: 1
  | ...
 
 test_run:cmd("setopt delimiter ';'")
diff --git a/test/sql/full_metadata.test.lua b/test/sql/full_metadata.test.lua
index 576c49a..a9ba320 100644
--- a/test/sql/full_metadata.test.lua
+++ b/test/sql/full_metadata.test.lua
@@ -23,7 +23,7 @@ else
 end;
 test_run:cmd("setopt delimiter ''");
 
-execute("PRAGMA full_metadata = true;")
+execute([[UPDATE "_session_settings" SET "value" = true WHERE "name" = 'sql_full_metadata';]])
 -- Make sure collation is presented in extended metadata.
 --
 execute("SELECT 'aSd' COLLATE \"unicode_ci\";")
@@ -45,7 +45,7 @@ box.execute("CREATE VIEW v AS SELECT id + 1 AS x, a AS y, c || 'abc' FROM t;")
 execute("SELECT * FROM v;")
 execute("SELECT x, y FROM v;")
 
-execute("PRAGMA full_metadata = false;")
+execute([[UPDATE "_session_settings" SET "value" = false WHERE "name" = 'sql_full_metadata';]])
 
 test_run:cmd("setopt delimiter ';'")
 if remote then
diff --git a/test/sql/func-recreate.result b/test/sql/func-recreate.result
index a0a67a1..3709df7 100644
--- a/test/sql/func-recreate.result
+++ b/test/sql/func-recreate.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- Check errors during function create process
 fiber = require('fiber')
diff --git a/test/sql/func-recreate.test.lua b/test/sql/func-recreate.test.lua
index 0b32ea9..b76789f 100644
--- a/test/sql/func-recreate.test.lua
+++ b/test/sql/func-recreate.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- Check errors during function create process
 fiber = require('fiber')
diff --git a/test/sql/gh-2362-select-access-rights.result b/test/sql/gh-2362-select-access-rights.result
index b15b0da..5ac82b1 100644
--- a/test/sql/gh-2362-select-access-rights.result
+++ b/test/sql/gh-2362-select-access-rights.result
@@ -4,12 +4,11 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-nb = require('net.box')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
 ...
-box.execute("PRAGMA sql_default_engine='"..engine.."'")
+nb = require('net.box')
 ---
-- row_count: 0
 ...
 box.execute("CREATE TABLE t1 (s1 INT PRIMARY KEY, s2 INT UNIQUE);")
 ---
diff --git a/test/sql/gh-2362-select-access-rights.test.lua b/test/sql/gh-2362-select-access-rights.test.lua
index f2b66b6..3409dcd 100644
--- a/test/sql/gh-2362-select-access-rights.test.lua
+++ b/test/sql/gh-2362-select-access-rights.test.lua
@@ -1,8 +1,8 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 nb = require('net.box')
 
-box.execute("PRAGMA sql_default_engine='"..engine.."'")
 box.execute("CREATE TABLE t1 (s1 INT PRIMARY KEY, s2 INT UNIQUE);")
 box.execute("CREATE TABLE t2 (s1 INT PRIMARY KEY);")
 box.execute("INSERT INTO t1 VALUES (1, 1);")
diff --git a/test/sql/gh-2929-primary-key.result b/test/sql/gh-2929-primary-key.result
index 021d037..263b89d 100644
--- a/test/sql/gh-2929-primary-key.result
+++ b/test/sql/gh-2929-primary-key.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- All tables in SQL are now WITHOUT ROW ID, so if user
 -- tries to create table without a primary key, an appropriate error message
diff --git a/test/sql/gh-2929-primary-key.test.lua b/test/sql/gh-2929-primary-key.test.lua
index 9cc6cd5..935d297 100644
--- a/test/sql/gh-2929-primary-key.test.lua
+++ b/test/sql/gh-2929-primary-key.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- All tables in SQL are now WITHOUT ROW ID, so if user
 -- tries to create table without a primary key, an appropriate error message
diff --git a/test/sql/gh-2981-check-autoinc.result b/test/sql/gh-2981-check-autoinc.result
index d2938cd..71c06e5 100644
--- a/test/sql/gh-2981-check-autoinc.result
+++ b/test/sql/gh-2981-check-autoinc.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 box.cfg{}
 ---
diff --git a/test/sql/gh-2981-check-autoinc.test.lua b/test/sql/gh-2981-check-autoinc.test.lua
index 0eb8f73..ed60964 100644
--- a/test/sql/gh-2981-check-autoinc.test.lua
+++ b/test/sql/gh-2981-check-autoinc.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 box.cfg{}
 
diff --git a/test/sql/gh-3199-no-mem-leaks.result b/test/sql/gh-3199-no-mem-leaks.result
index e7ba1d2..35d8572 100644
--- a/test/sql/gh-3199-no-mem-leaks.result
+++ b/test/sql/gh-3199-no-mem-leaks.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 fiber = require('fiber')
 ---
diff --git a/test/sql/gh-3199-no-mem-leaks.test.lua b/test/sql/gh-3199-no-mem-leaks.test.lua
index 54a6ce5..41648d0 100644
--- a/test/sql/gh-3199-no-mem-leaks.test.lua
+++ b/test/sql/gh-3199-no-mem-leaks.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 fiber = require('fiber')
 
 -- This test checks that no leaks of region memory happens during
diff --git a/test/sql/gh-3613-idx-alter-update-2.result b/test/sql/gh-3613-idx-alter-update-2.result
index ff63eb2..86965c4 100644
--- a/test/sql/gh-3613-idx-alter-update-2.result
+++ b/test/sql/gh-3613-idx-alter-update-2.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 box.execute('CREATE TABLE t (s1 INT PRIMARY KEY)')
 ---
diff --git a/test/sql/gh-3613-idx-alter-update-2.test.lua b/test/sql/gh-3613-idx-alter-update-2.test.lua
index ff5b651..f67b847 100644
--- a/test/sql/gh-3613-idx-alter-update-2.test.lua
+++ b/test/sql/gh-3613-idx-alter-update-2.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 box.execute('CREATE TABLE t (s1 INT PRIMARY KEY)')
 box.execute('CREATE INDEX i ON t (s1)')
diff --git a/test/sql/gh-3613-idx-alter-update.result b/test/sql/gh-3613-idx-alter-update.result
index ba323a6..e8afc4d 100644
--- a/test/sql/gh-3613-idx-alter-update.result
+++ b/test/sql/gh-3613-idx-alter-update.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 box.execute('CREATE TABLE t (s1 INT PRIMARY KEY)')
 ---
diff --git a/test/sql/gh-3613-idx-alter-update.test.lua b/test/sql/gh-3613-idx-alter-update.test.lua
index 3027182..56843d3 100644
--- a/test/sql/gh-3613-idx-alter-update.test.lua
+++ b/test/sql/gh-3613-idx-alter-update.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 box.execute('CREATE TABLE t (s1 INT PRIMARY KEY)')
 box.execute('CREATE INDEX i ON t (s1)')
diff --git a/test/sql/gh-3888-values-blob-assert.result b/test/sql/gh-3888-values-blob-assert.result
index 2cd6150..0a1af28 100644
--- a/test/sql/gh-3888-values-blob-assert.result
+++ b/test/sql/gh-3888-values-blob-assert.result
@@ -10,9 +10,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- check 'VALUES' against typedef keywords (should fail)
 box.execute('VALUES(scalar)')
diff --git a/test/sql/gh-3888-values-blob-assert.test.lua b/test/sql/gh-3888-values-blob-assert.test.lua
index 0b7c385..497d563 100644
--- a/test/sql/gh-3888-values-blob-assert.test.lua
+++ b/test/sql/gh-3888-values-blob-assert.test.lua
@@ -6,7 +6,7 @@
 --
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- check 'VALUES' against typedef keywords (should fail)
 box.execute('VALUES(scalar)')
diff --git a/test/sql/gh2141-delete-trigger-drop-table.result b/test/sql/gh2141-delete-trigger-drop-table.result
index 1d373f5..f8981e4 100644
--- a/test/sql/gh2141-delete-trigger-drop-table.result
+++ b/test/sql/gh2141-delete-trigger-drop-table.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- create space
 box.execute("CREATE TABLE t(id INT PRIMARY KEY)")
diff --git a/test/sql/gh2141-delete-trigger-drop-table.test.lua b/test/sql/gh2141-delete-trigger-drop-table.test.lua
index 4d21fd7..904b52e 100644
--- a/test/sql/gh2141-delete-trigger-drop-table.test.lua
+++ b/test/sql/gh2141-delete-trigger-drop-table.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- create space
 box.execute("CREATE TABLE t(id INT PRIMARY KEY)")
diff --git a/test/sql/gh2251-multiple-update.result b/test/sql/gh2251-multiple-update.result
index 42ebf7f..f3658ed 100644
--- a/test/sql/gh2251-multiple-update.result
+++ b/test/sql/gh2251-multiple-update.result
@@ -5,9 +5,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 box.execute("CREATE TABLE t1(a integer primary key, b INT UNIQUE, e INT);")
diff --git a/test/sql/gh2251-multiple-update.test.lua b/test/sql/gh2251-multiple-update.test.lua
index 4d55096..2d0e07d 100644
--- a/test/sql/gh2251-multiple-update.test.lua
+++ b/test/sql/gh2251-multiple-update.test.lua
@@ -1,7 +1,7 @@
 -- Regression test for #2251
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
diff --git a/test/sql/gh2483-remote-persistency-check.result b/test/sql/gh2483-remote-persistency-check.result
index d69fcbd..3ee49b3 100644
--- a/test/sql/gh2483-remote-persistency-check.result
+++ b/test/sql/gh2483-remote-persistency-check.result
@@ -8,9 +8,8 @@ test_run = env.new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 box.schema.user.grant('guest', 'read,write,execute', 'universe')
 ---
diff --git a/test/sql/gh2483-remote-persistency-check.test.lua b/test/sql/gh2483-remote-persistency-check.test.lua
index 7db1602..b36b402 100644
--- a/test/sql/gh2483-remote-persistency-check.test.lua
+++ b/test/sql/gh2483-remote-persistency-check.test.lua
@@ -2,7 +2,7 @@
 env = require('test_run')
 test_run = env.new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 box.schema.user.grant('guest', 'read,write,execute', 'universe')
 
diff --git a/test/sql/gh2808-inline-unique-persistency-check.result b/test/sql/gh2808-inline-unique-persistency-check.result
index a277b3f..b84925c 100644
--- a/test/sql/gh2808-inline-unique-persistency-check.result
+++ b/test/sql/gh2808-inline-unique-persistency-check.result
@@ -8,9 +8,8 @@ test_run = env.new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- Create a table and insert a datum
 box.execute([[CREATE TABLE t1(a INT PRIMARY KEY, b INT, UNIQUE(b));]])
diff --git a/test/sql/gh2808-inline-unique-persistency-check.test.lua b/test/sql/gh2808-inline-unique-persistency-check.test.lua
index 26b646a..bbffc92 100644
--- a/test/sql/gh2808-inline-unique-persistency-check.test.lua
+++ b/test/sql/gh2808-inline-unique-persistency-check.test.lua
@@ -2,7 +2,7 @@
 env = require('test_run')
 test_run = env.new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- Create a table and insert a datum
 box.execute([[CREATE TABLE t1(a INT PRIMARY KEY, b INT, UNIQUE(b));]])
diff --git a/test/sql/icu-upper-lower.result b/test/sql/icu-upper-lower.result
index 8ff7528..f7b9dfa 100644
--- a/test/sql/icu-upper-lower.result
+++ b/test/sql/icu-upper-lower.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 test_run:cmd("setopt delimiter ';'")
 ---
diff --git a/test/sql/icu-upper-lower.test.lua b/test/sql/icu-upper-lower.test.lua
index 00e9699..f358733 100644
--- a/test/sql/icu-upper-lower.test.lua
+++ b/test/sql/icu-upper-lower.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 test_run:cmd("setopt delimiter ';'")
 
diff --git a/test/sql/insert-unique.result b/test/sql/insert-unique.result
index 1cf44c9..ff2930e 100644
--- a/test/sql/insert-unique.result
+++ b/test/sql/insert-unique.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -18,8 +17,6 @@ box.execute("CREATE UNIQUE INDEX zoobar2 ON zoobar(c1, c4)")
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 -- Seed entry
 box.execute("INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 ---
diff --git a/test/sql/insert-unique.test.lua b/test/sql/insert-unique.test.lua
index 026bc9d..2c1214a 100644
--- a/test/sql/insert-unique.test.lua
+++ b/test/sql/insert-unique.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
@@ -8,9 +8,6 @@ box.execute('pragma sql_default_engine=\''..engine..'\'')
 box.execute("CREATE TABLE zoobar (c1 INT, c2 INT PRIMARY KEY, c3 TEXT, c4 INT)")
 box.execute("CREATE UNIQUE INDEX zoobar2 ON zoobar(c1, c4)")
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
-
 -- Seed entry
 box.execute("INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 
diff --git a/test/sql/integer-overflow.result b/test/sql/integer-overflow.result
index d6223ff..db5c2f7 100644
--- a/test/sql/integer-overflow.result
+++ b/test/sql/integer-overflow.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- gh-3735: make sure that integer overflows errors are
 -- handled during VDBE execution.
diff --git a/test/sql/integer-overflow.test.lua b/test/sql/integer-overflow.test.lua
index 17051f9..2ac9799 100644
--- a/test/sql/integer-overflow.test.lua
+++ b/test/sql/integer-overflow.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- gh-3735: make sure that integer overflows errors are
 -- handled during VDBE execution.
diff --git a/test/sql/iproto.result b/test/sql/iproto.result
index 3240c2b..9f67df9 100644
--- a/test/sql/iproto.result
+++ b/test/sql/iproto.result
@@ -7,9 +7,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 box.execute('create table test (id int primary key, a NUMBER, b text)')
 ---
diff --git a/test/sql/iproto.test.lua b/test/sql/iproto.test.lua
index b5ec2c0..4019fb7 100644
--- a/test/sql/iproto.test.lua
+++ b/test/sql/iproto.test.lua
@@ -1,7 +1,7 @@
 remote = require('net.box')
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 box.execute('create table test (id int primary key, a NUMBER, b text)')
 space = box.space.TEST
diff --git a/test/sql/max-on-index.result b/test/sql/max-on-index.result
index 57ce95b..1cd488f 100644
--- a/test/sql/max-on-index.result
+++ b/test/sql/max-on-index.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -24,8 +23,6 @@ box.execute("CREATE TABLE test2 (f1 INT, f2 INT, PRIMARY KEY(f1))")
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 -- Seed entries
 box.execute("INSERT INTO test1 VALUES(1, 2)");
 ---
diff --git a/test/sql/max-on-index.test.lua b/test/sql/max-on-index.test.lua
index 4cceaa7..912602e 100644
--- a/test/sql/max-on-index.test.lua
+++ b/test/sql/max-on-index.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
@@ -12,9 +12,6 @@ box.execute("CREATE INDEX test1_index ON test1 (f2)")
 -- integer affinity
 box.execute("CREATE TABLE test2 (f1 INT, f2 INT, PRIMARY KEY(f1))")
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
-
 -- Seed entries
 box.execute("INSERT INTO test1 VALUES(1, 2)");
 box.execute("INSERT INTO test1 VALUES(2, NULL)");
diff --git a/test/sql/message-func-indexes.result b/test/sql/message-func-indexes.result
index 69e3ee0..002dbd8 100644
--- a/test/sql/message-func-indexes.result
+++ b/test/sql/message-func-indexes.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- Creating tables.
 box.execute("CREATE TABLE t1(id INTEGER PRIMARY KEY, a INTEGER)")
diff --git a/test/sql/message-func-indexes.test.lua b/test/sql/message-func-indexes.test.lua
index 9ac5f47..3cbfe3e 100644
--- a/test/sql/message-func-indexes.test.lua
+++ b/test/sql/message-func-indexes.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- Creating tables.
 box.execute("CREATE TABLE t1(id INTEGER PRIMARY KEY, a INTEGER)")
diff --git a/test/sql/misc.result b/test/sql/misc.result
index 050d378..0190a58 100644
--- a/test/sql/misc.result
+++ b/test/sql/misc.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- Forbid multistatement queries.
 box.execute('select 1;')
diff --git a/test/sql/misc.test.lua b/test/sql/misc.test.lua
index 541660c..6324422 100644
--- a/test/sql/misc.test.lua
+++ b/test/sql/misc.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- Forbid multistatement queries.
 box.execute('select 1;')
diff --git a/test/sql/no-pk-space.result b/test/sql/no-pk-space.result
index 025f363..12f2407 100644
--- a/test/sql/no-pk-space.result
+++ b/test/sql/no-pk-space.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 format = {}
 ---
diff --git a/test/sql/no-pk-space.test.lua b/test/sql/no-pk-space.test.lua
index 318c2ac..d7f9479 100644
--- a/test/sql/no-pk-space.test.lua
+++ b/test/sql/no-pk-space.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 format = {}
 format[1] = {'id', 'integer'}
diff --git a/test/sql/on-conflict.result b/test/sql/on-conflict.result
index d5a6938..ab6e4f4 100644
--- a/test/sql/on-conflict.result
+++ b/test/sql/on-conflict.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 --
 -- Check that original sql ON CONFLICT clause is really
diff --git a/test/sql/on-conflict.test.lua b/test/sql/on-conflict.test.lua
index 1aa4d1b..ec85fe2 100644
--- a/test/sql/on-conflict.test.lua
+++ b/test/sql/on-conflict.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 --
 -- Check that original sql ON CONFLICT clause is really
 -- disabled.
diff --git a/test/sql/persistency.result b/test/sql/persistency.result
index f8f992c..6d14d4c 100644
--- a/test/sql/persistency.result
+++ b/test/sql/persistency.result
@@ -7,9 +7,8 @@ test_run = env.new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- create space
 box.execute("CREATE TABLE foobar (foo INT PRIMARY KEY, bar TEXT)")
diff --git a/test/sql/persistency.test.lua b/test/sql/persistency.test.lua
index 1964453..fdd0bb6 100644
--- a/test/sql/persistency.test.lua
+++ b/test/sql/persistency.test.lua
@@ -1,7 +1,7 @@
 env = require('test_run')
 test_run = env.new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- create space
 box.execute("CREATE TABLE foobar (foo INT PRIMARY KEY, bar TEXT)")
diff --git a/test/sql/row-count.result b/test/sql/row-count.result
index 6bf74ed..02acd79 100644
--- a/test/sql/row-count.result
+++ b/test/sql/row-count.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- Test cases concerning row count calculations.
 --
@@ -314,13 +313,9 @@ box.execute("SELECT ROW_COUNT();")
   rows:
   - [0]
 ...
-box.execute('PRAGMA recursive_triggers')
+box.space._session_settings:get('sql_recursive_triggers')
 ---
-- metadata:
-  - name: recursive_triggers
-    type: integer
-  rows:
-  - [1]
+- ['sql_recursive_triggers', true]
 ...
 -- Clean-up.
 --
diff --git a/test/sql/row-count.test.lua b/test/sql/row-count.test.lua
index 369e7fa..d381672 100644
--- a/test/sql/row-count.test.lua
+++ b/test/sql/row-count.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- Test cases concerning row count calculations.
 --
@@ -65,7 +65,7 @@ box.execute("SELECT ROW_COUNT();")
 box.execute("SELECT ROW_COUNT();")
 box.execute("EXPLAIN QUERY PLAN INSERT INTO t1 VALUES ('b'), ('c'), ('d');")
 box.execute("SELECT ROW_COUNT();")
-box.execute('PRAGMA recursive_triggers')
+box.space._session_settings:get('sql_recursive_triggers')
 
 -- Clean-up.
 --
diff --git a/test/sql/savepoints.result b/test/sql/savepoints.result
index e48db30..509c33e 100644
--- a/test/sql/savepoints.result
+++ b/test/sql/savepoints.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- These tests check that SQL savepoints properly work outside
 -- transactions as well as inside transactions started in Lua.
diff --git a/test/sql/savepoints.test.lua b/test/sql/savepoints.test.lua
index 99622a4..f1b15c7 100644
--- a/test/sql/savepoints.test.lua
+++ b/test/sql/savepoints.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- These tests check that SQL savepoints properly work outside
 -- transactions as well as inside transactions started in Lua.
diff --git a/test/sql/select-null.result b/test/sql/select-null.result
index 83d9776..5bd46cd 100644
--- a/test/sql/select-null.result
+++ b/test/sql/select-null.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -14,8 +13,6 @@ box.execute("CREATE TABLE t3(id INT, a text, b TEXT, PRIMARY KEY(id))")
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 -- Seed entries
 box.execute("INSERT INTO t3 VALUES(1, 'abc',NULL)");
 ---
diff --git a/test/sql/select-null.test.lua b/test/sql/select-null.test.lua
index a49eb43..2ce964d 100644
--- a/test/sql/select-null.test.lua
+++ b/test/sql/select-null.test.lua
@@ -1,15 +1,12 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
 -- create space
 box.execute("CREATE TABLE t3(id INT, a text, b TEXT, PRIMARY KEY(id))")
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
-
 -- Seed entries
 box.execute("INSERT INTO t3 VALUES(1, 'abc',NULL)");
 box.execute("INSERT INTO t3 VALUES(2, NULL,'xyz')");
diff --git a/test/sql/sql-debug.result b/test/sql/sql-debug.result
deleted file mode 100644
index 150f1ec..0000000
--- a/test/sql/sql-debug.result
+++ /dev/null
@@ -1,54 +0,0 @@
-remote = require('net.box')
----
-...
-test_run = require('test_run').new()
----
-...
---
--- gh-3832: Some statements do not return column type
--- Check that "PRAGMA parser_trace" returns 0 or 1 if called
--- without parameter.
-result = box.execute('PRAGMA parser_trace').rows
----
-...
-box.execute('PRAGMA parser_trace = 1')
----
-- row_count: 0
-...
-box.execute('PRAGMA parser_trace')
----
-- metadata:
-  - name: parser_trace
-    type: integer
-  rows:
-  - [1]
-...
-box.execute('PRAGMA parser_trace = '.. result[1][1])
----
-- row_count: 0
-...
---
--- Make PRAGMA command return the result as a result set.
---
-box.execute('PRAGMA')
----
-- metadata:
-  - name: pragma_name
-    type: text
-  - name: pragma_value
-    type: integer
-  rows:
-  - ['defer_foreign_keys', 0]
-  - ['full_column_names', 0]
-  - ['full_metadata', 0]
-  - ['parser_trace', 0]
-  - ['recursive_triggers', 1]
-  - ['reverse_unordered_selects', 0]
-  - ['select_trace', 0]
-  - ['sql_trace', 0]
-  - ['vdbe_debug', 0]
-  - ['vdbe_eqp', 0]
-  - ['vdbe_listing', 0]
-  - ['vdbe_trace', 0]
-  - ['where_trace', 0]
-...
diff --git a/test/sql/sql-debug.test.lua b/test/sql/sql-debug.test.lua
deleted file mode 100644
index edd0ef4..0000000
--- a/test/sql/sql-debug.test.lua
+++ /dev/null
@@ -1,17 +0,0 @@
-remote = require('net.box')
-test_run = require('test_run').new()
-
---
--- gh-3832: Some statements do not return column type
-
--- Check that "PRAGMA parser_trace" returns 0 or 1 if called
--- without parameter.
-result = box.execute('PRAGMA parser_trace').rows
-box.execute('PRAGMA parser_trace = 1')
-box.execute('PRAGMA parser_trace')
-box.execute('PRAGMA parser_trace = '.. result[1][1])
-
---
--- Make PRAGMA command return the result as a result set.
---
-box.execute('PRAGMA')
diff --git a/test/sql/sql-statN-index-drop.test.lua b/test/sql/sql-statN-index-drop.test.lua
index 5477a2a..7e3a04e 100644
--- a/test/sql/sql-statN-index-drop.test.lua
+++ b/test/sql/sql-statN-index-drop.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- Initializing some things.
 box.execute("CREATE TABLE t1(id INT PRIMARY KEY, a INT);")
diff --git a/test/sql/suite.ini b/test/sql/suite.ini
index a8664c5..57e78f1 100644
--- a/test/sql/suite.ini
+++ b/test/sql/suite.ini
@@ -7,7 +7,7 @@ use_unix_sockets_iproto = True
 config = engine.cfg
 is_parallel = True
 lua_libs = lua/sql_tokenizer.lua
-release_disabled = errinj.test.lua view_delayed_wal.test.lua sql-debug.test.lua
+release_disabled = errinj.test.lua view_delayed_wal.test.lua
 disabled = sql-statN-index-drop.test.lua
 pretest_clean = True
 fragile = dll.test.lua           ; gh-4427
diff --git a/test/sql/tokenizer.result b/test/sql/tokenizer.result
index 1ae9ef2..d127bd0 100644
--- a/test/sql/tokenizer.result
+++ b/test/sql/tokenizer.result
@@ -7,9 +7,8 @@ test_run = env.new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 sql_tokenizer = require('sql_tokenizer')
 ---
diff --git a/test/sql/tokenizer.test.lua b/test/sql/tokenizer.test.lua
index 3f5dd12..39fdf1f 100644
--- a/test/sql/tokenizer.test.lua
+++ b/test/sql/tokenizer.test.lua
@@ -1,7 +1,7 @@
 env = require('test_run')
 test_run = env.new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 sql_tokenizer = require('sql_tokenizer')
 
diff --git a/test/sql/transition.result b/test/sql/transition.result
index 9738092..c14055b 100644
--- a/test/sql/transition.result
+++ b/test/sql/transition.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- create space
 box.execute("CREATE TABLE foobar (foo INT PRIMARY KEY, bar TEXT)")
diff --git a/test/sql/transition.test.lua b/test/sql/transition.test.lua
index a05c26a..053a3cd 100644
--- a/test/sql/transition.test.lua
+++ b/test/sql/transition.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- create space
 box.execute("CREATE TABLE foobar (foo INT PRIMARY KEY, bar TEXT)")
diff --git a/test/sql/transitive-transactions.result b/test/sql/transitive-transactions.result
index 29c7316..91c35a3 100644
--- a/test/sql/transitive-transactions.result
+++ b/test/sql/transitive-transactions.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute("pragma sql_default_engine=\'"..engine.."\'")
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 test_run:cmd("setopt delimiter ';'")
 ---
@@ -88,7 +87,7 @@ box.space.PARENT:select();
 ---
 - - [1, 1]
 ...
--- Make sure that 'PRAGMA defer_foreign_keys' works.
+-- Make sure that setting 'defer_foreign_keys' works.
 --
 box.execute('DROP TABLE child;')
 box.execute('CREATE TABLE child(id INT PRIMARY KEY, x INT REFERENCES parent(y))')
@@ -116,7 +115,7 @@ box.space.PARENT:select();
 ---
 - - [1, 1]
 ...
-box.execute('PRAGMA defer_foreign_keys = 1;')
+box.space._session_settings:update('sql_defer_foreign_keys', {{'=', 2, true}})
 box.rollback()
 fk_defer();
 ---
@@ -131,7 +130,7 @@ box.space.PARENT:select();
   - [2, 2]
 ...
 -- Cleanup
-box.execute('PRAGMA defer_foreign_keys = 0;')
+box.space._session_settings:update('sql_defer_foreign_keys', {{'=', 2, false}})
 
 box.execute('DROP TABLE child;');
 ---
diff --git a/test/sql/transitive-transactions.test.lua b/test/sql/transitive-transactions.test.lua
index 4633f07..5565de7 100644
--- a/test/sql/transitive-transactions.test.lua
+++ b/test/sql/transitive-transactions.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute("pragma sql_default_engine=\'"..engine.."\'")
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 test_run:cmd("setopt delimiter ';'")
 
 -- These tests are aimed at checking transitive transactions
@@ -45,7 +45,7 @@ fk_violation_3();
 box.space.CHILD:select();
 box.space.PARENT:select();
 
--- Make sure that 'PRAGMA defer_foreign_keys' works.
+-- Make sure that setting 'defer_foreign_keys' works.
 --
 box.execute('DROP TABLE child;')
 box.execute('CREATE TABLE child(id INT PRIMARY KEY, x INT REFERENCES parent(y))')
@@ -62,13 +62,12 @@ end;
 fk_defer();
 box.space.CHILD:select();
 box.space.PARENT:select();
-box.execute('PRAGMA defer_foreign_keys = 1;')
+box.space._session_settings:update('sql_defer_foreign_keys', {{'=', 2, true}})
 box.rollback()
 fk_defer();
 box.space.CHILD:select();
 box.space.PARENT:select();
-
-box.execute('PRAGMA defer_foreign_keys = 0;')
+box.space._session_settings:update('sql_defer_foreign_keys', {{'=', 2, false}})
 
 -- Cleanup
 box.execute('DROP TABLE child;');
diff --git a/test/sql/triggers.result b/test/sql/triggers.result
index 7611ea9..ceecb8e 100644
--- a/test/sql/triggers.result
+++ b/test/sql/triggers.result
@@ -7,9 +7,8 @@ test_run = env.new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- Get invariant part of the tuple; name and opts don't change.
  function immutable_part(data) local r = {} for i, l in pairs(data) do table.insert(r, {l.name, l.opts}) end return r end
@@ -292,9 +291,9 @@ box.execute("DROP TABLE T1;")
 -- gh-3531: Assertion with trigger and two storage engines
 --
 -- Case 1: Src 'vinyl' table; Dst 'memtx' table
-box.execute("PRAGMA sql_default_engine ('vinyl');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'vinyl']
 ...
 box.execute("CREATE TABLE m (s0 INT PRIMARY KEY, s1 TEXT UNIQUE);")
 ---
@@ -304,9 +303,9 @@ box.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SE
 ---
 - row_count: 1
 ...
-box.execute("PRAGMA sql_default_engine('memtx');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'memtx'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'memtx']
 ...
 box.execute("CREATE TABLE n (s0 INT PRIMARY KEY, s1 TEXT UNIQUE, s2 NUMBER);")
 ---
@@ -336,9 +335,9 @@ box.execute("DROP TABLE n;")
 - row_count: 1
 ...
 -- Case 2: Src 'memtx' table; Dst 'vinyl' table
-box.execute("PRAGMA sql_default_engine ('memtx');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'memtx'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'memtx']
 ...
 box.execute("CREATE TABLE m (s0 INT PRIMARY KEY, s1 TEXT UNIQUE);")
 ---
@@ -348,9 +347,9 @@ box.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SE
 ---
 - row_count: 1
 ...
-box.execute("PRAGMA sql_default_engine('vinyl');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'vinyl']
 ...
 box.execute("CREATE TABLE n (s0 INT PRIMARY KEY, s1 TEXT UNIQUE, s2 NUMBER);")
 ---
@@ -380,17 +379,17 @@ box.execute("DROP TABLE n;")
 - row_count: 1
 ...
 -- Test SQL Transaction with LUA
-box.execute("PRAGMA sql_default_engine ('memtx');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'memtx'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'memtx']
 ...
 box.execute("CREATE TABLE test (id INT PRIMARY KEY)")
 ---
 - row_count: 1
 ...
-box.execute("PRAGMA sql_default_engine='vinyl'")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'vinyl']
 ...
 box.execute("CREATE TABLE test2 (id INT PRIMARY KEY)")
 ---
diff --git a/test/sql/triggers.test.lua b/test/sql/triggers.test.lua
index f0397dc..f5c8a39 100644
--- a/test/sql/triggers.test.lua
+++ b/test/sql/triggers.test.lua
@@ -1,7 +1,7 @@
 env = require('test_run')
 test_run = env.new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- Get invariant part of the tuple; name and opts don't change.
  function immutable_part(data) local r = {} for i, l in pairs(data) do table.insert(r, {l.name, l.opts}) end return r end
@@ -100,10 +100,10 @@ box.execute("DROP TABLE T1;")
 -- gh-3531: Assertion with trigger and two storage engines
 --
 -- Case 1: Src 'vinyl' table; Dst 'memtx' table
-box.execute("PRAGMA sql_default_engine ('vinyl');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 box.execute("CREATE TABLE m (s0 INT PRIMARY KEY, s1 TEXT UNIQUE);")
 box.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = 'now'; END;")
-box.execute("PRAGMA sql_default_engine('memtx');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'memtx'}})
 box.execute("CREATE TABLE n (s0 INT PRIMARY KEY, s1 TEXT UNIQUE, s2 NUMBER);")
 box.execute("INSERT INTO m VALUES (0, '0');")
 box.execute("INSERT INTO n VALUES (0, '',null);")
@@ -116,10 +116,10 @@ box.execute("DROP TABLE n;")
 
 
 -- Case 2: Src 'memtx' table; Dst 'vinyl' table
-box.execute("PRAGMA sql_default_engine ('memtx');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'memtx'}})
 box.execute("CREATE TABLE m (s0 INT PRIMARY KEY, s1 TEXT UNIQUE);")
 box.execute("CREATE TRIGGER m1 BEFORE UPDATE ON m FOR EACH ROW BEGIN UPDATE n SET s2 = 'now'; END;")
-box.execute("PRAGMA sql_default_engine('vinyl');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 box.execute("CREATE TABLE n (s0 INT PRIMARY KEY, s1 TEXT UNIQUE, s2 NUMBER);")
 box.execute("INSERT INTO m VALUES (0, '0');")
 box.execute("INSERT INTO n VALUES (0, '',null);")
@@ -131,9 +131,9 @@ box.execute("DROP TABLE m;")
 box.execute("DROP TABLE n;")
 
 -- Test SQL Transaction with LUA
-box.execute("PRAGMA sql_default_engine ('memtx');")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'memtx'}})
 box.execute("CREATE TABLE test (id INT PRIMARY KEY)")
-box.execute("PRAGMA sql_default_engine='vinyl'")
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 box.execute("CREATE TABLE test2 (id INT PRIMARY KEY)")
 box.execute("INSERT INTO test2 VALUES (2)")
 box.execute("START TRANSACTION")
diff --git a/test/sql/update-with-nested-select.result b/test/sql/update-with-nested-select.result
index 3172430..2b6525e 100644
--- a/test/sql/update-with-nested-select.result
+++ b/test/sql/update-with-nested-select.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- box.cfg()
 -- create space
@@ -14,8 +13,6 @@ box.execute("CREATE TABLE t1(a integer primary key, b INT UNIQUE, e INT);");
 ---
 - row_count: 1
 ...
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
 -- Seed entries
 box.execute("INSERT INTO t1 VALUES(1,4,6);");
 ---
diff --git a/test/sql/update-with-nested-select.test.lua b/test/sql/update-with-nested-select.test.lua
index 88424fc..631ce3566 100644
--- a/test/sql/update-with-nested-select.test.lua
+++ b/test/sql/update-with-nested-select.test.lua
@@ -1,15 +1,12 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- box.cfg()
 
 -- create space
 box.execute("CREATE TABLE t1(a integer primary key, b INT UNIQUE, e INT);");
 
--- Debug
--- box.execute("PRAGMA vdbe_debug=ON ; INSERT INTO zoobar VALUES (111, 222, 'c3', 444)")
-
 -- Seed entries
 box.execute("INSERT INTO t1 VALUES(1,4,6);");
 box.execute("INSERT INTO t1 VALUES(2,5,7);");
diff --git a/test/sql/upgrade.result b/test/sql/upgrade.result
index f0997e1..8803d2d 100644
--- a/test/sql/upgrade.result
+++ b/test/sql/upgrade.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 work_dir = 'sql/upgrade/1.10/'
 ---
diff --git a/test/sql/upgrade.test.lua b/test/sql/upgrade.test.lua
index 37425ae..ad3b20e 100644
--- a/test/sql/upgrade.test.lua
+++ b/test/sql/upgrade.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 work_dir = 'sql/upgrade/1.10/'
 test_run:cmd('create server upgrade with script="sql/upgrade/upgrade.lua", workdir="' .. work_dir .. '"')
diff --git a/test/sql/view.result b/test/sql/view.result
index d845df8..f3b4da1 100644
--- a/test/sql/view.result
+++ b/test/sql/view.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 -- Verify that constraints on 'view' option are working.
 -- box.cfg()
diff --git a/test/sql/view.test.lua b/test/sql/view.test.lua
index 0008056..76ea303 100644
--- a/test/sql/view.test.lua
+++ b/test/sql/view.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 
 -- Verify that constraints on 'view' option are working.
 
diff --git a/test/sql/view_delayed_wal.result b/test/sql/view_delayed_wal.result
index d518e7d..14f3bff 100644
--- a/test/sql/view_delayed_wal.result
+++ b/test/sql/view_delayed_wal.result
@@ -4,9 +4,8 @@ test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
 ---
 ...
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 ---
-- row_count: 0
 ...
 fiber = require('fiber')
 ---
diff --git a/test/sql/view_delayed_wal.test.lua b/test/sql/view_delayed_wal.test.lua
index 7e6fce6..6660fd2 100644
--- a/test/sql/view_delayed_wal.test.lua
+++ b/test/sql/view_delayed_wal.test.lua
@@ -1,6 +1,6 @@
 test_run = require('test_run').new()
 engine = test_run:get_cfg('engine')
-box.execute('pragma sql_default_engine=\''..engine..'\'')
+_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
 fiber = require('fiber')
 
 -- View reference counters are incremented before firing
diff --git a/test/sql/vinyl-opts.result b/test/sql/vinyl-opts.result
index 10a649a..4d80245 100644
--- a/test/sql/vinyl-opts.result
+++ b/test/sql/vinyl-opts.result
@@ -13,9 +13,9 @@ test_run:cmd("switch test")
 ---
 - true
 ...
-box.execute('pragma sql_default_engine= \'vinyl\'')
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 ---
-- row_count: 0
+- ['sql_default_engine', 'vinyl']
 ...
 box.execute('CREATE TABLE v1 (id INT PRIMARY KEY, b INT);')
 ---
diff --git a/test/sql/vinyl-opts.test.lua b/test/sql/vinyl-opts.test.lua
index 4460724..a0cb775 100644
--- a/test/sql/vinyl-opts.test.lua
+++ b/test/sql/vinyl-opts.test.lua
@@ -3,7 +3,7 @@ test_run:cmd("create server test with script='sql/vinyl-opts-cfg.lua'")
 test_run:cmd("start server test")
 test_run:cmd("switch test")
 
-box.execute('pragma sql_default_engine= \'vinyl\'')
+box.space._session_settings:update('sql_default_engine', {{'=', 2, 'vinyl'}})
 box.execute('CREATE TABLE v1 (id INT PRIMARY KEY, b INT);')
 box.space.V1.index[0].options
 
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Tarantool-patches] [PATCH v2 9/9] sql: refactor PRAGMA-related code
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
                   ` (7 preceding siblings ...)
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 8/9] sql: remove control pragmas imeevma
@ 2019-12-30 16:43 ` imeevma
  2019-12-30 23:31 ` [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas Nikita Pettik
  2019-12-31  8:01 ` Kirill Yukhin
  10 siblings, 0 replies; 17+ messages in thread
From: imeevma @ 2019-12-30 16:43 UTC (permalink / raw)
  To: korablev; +Cc: tarantool-patches

---
 src/box/sql/parse.y              |  34 +-----
 src/box/sql/pragma.c             | 248 ++++++++++++++++++---------------------
 src/box/sql/pragma.h             |  95 +++++----------
 src/box/sql/sqlInt.h             |  17 ++-
 test/sql-tap/index-info.test.lua |   2 +-
 5 files changed, 167 insertions(+), 229 deletions(-)

diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
index 89773eb..cfe1c00 100644
--- a/src/box/sql/parse.y
+++ b/src/box/sql/parse.y
@@ -1544,40 +1544,14 @@ cmd ::= DROP INDEX ifexists(E) nm(X) ON fullname(Y).   {
 ///////////////////////////// The PRAGMA command /////////////////////////////
 //
 cmd ::= PRAGMA nm(X).                        {
-    sqlPragma(pParse,&X,0,0,0);
+    sqlPragma(pParse,&X,0,0);
 }
-cmd ::= PRAGMA nm(X) EQ nmnum(Y).  {
-    sqlPragma(pParse,&X,&Y,0,0);
-}
-cmd ::= PRAGMA nm(X) LP nmnum(Y) RP.         {
-    sqlPragma(pParse,&X,&Y,0,0);
-}
-cmd ::= PRAGMA nm(X) EQ minus_num(Y).        {
-    sqlPragma(pParse,&X,&Y,0,1);
-}
-cmd ::= PRAGMA nm(X) LP minus_num(Y) RP.     {
-    sqlPragma(pParse,&X,&Y,0,1);
+cmd ::= PRAGMA nm(X) LP nm(Y) RP.         {
+    sqlPragma(pParse,&X,&Y,0);
 }
 cmd ::= PRAGMA nm(X) LP nm(Z) DOT nm(Y) RP.  {
-    sqlPragma(pParse,&X,&Y,&Z,0);
+    sqlPragma(pParse,&X,&Y,&Z);
 }
-cmd ::= PRAGMA .                            {
-    sqlPragma(pParse, 0,0,0,0);
-}
-
-nmnum(A) ::= plus_num(A).
-nmnum(A) ::= STRING(A).
-nmnum(A) ::= TRUE(A).
-nmnum(A) ::= FALSE(A).
-nmnum(A) ::= nm(A).
-nmnum(A) ::= ON(A).
-nmnum(A) ::= DELETE(A).
-nmnum(A) ::= DEFAULT(A).
-
-%token_class number INTEGER|FLOAT.
-plus_num(A) ::= PLUS number(X).       {A = X;}
-plus_num(A) ::= number(A).
-minus_num(A) ::= MINUS number(X).     {A = X;}
 //////////////////////////// The CREATE TRIGGER command /////////////////////
 
 cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
index ee1348c..28ba645 100644
--- a/src/box/sql/pragma.c
+++ b/src/box/sql/pragma.c
@@ -43,22 +43,6 @@
 #include "vdbeInt.h"
 #include "box/schema.h"
 #include "box/session.h"
-
-/*
- ************************************************************************
- * pragma.h contains several pragmas, including utf's pragmas.
- * All that is not utf-8 should be omitted
- ************************************************************************
- */
-
-/***************************************************************************
- * The "pragma.h" include file is an automatically generated file that
- * that includes the PragType_XXXX macro definitions and the aPragmaName[]
- * object.  This ensures that the aPragmaName[] table is arranged in
- * lexicographical order to facility a binary search of the pragma name.
- * Do not edit pragma.h directly.  Edit and rerun the script in at
- * ../tool/mkpragmatab.tcl.
- */
 #include "pragma.h"
 #include "tarantoolInt.h"
 
@@ -78,7 +62,7 @@ vdbe_set_pragma_result_columns(struct Vdbe *v, const struct PragmaName *pragma)
 /*
  * Locate a pragma in the aPragmaName[] array.
  */
-static const PragmaName *
+static const struct PragmaName *
 pragmaLocate(const char *zName)
 {
 	int upr, lwr, mid, rc;
@@ -200,7 +184,7 @@ sql_pragma_table_stats(struct space *space, void *data)
  */
 static void
 sql_pragma_index_info(struct Parse *parse,
-		      MAYBE_UNUSED const PragmaName *pragma,
+		      MAYBE_UNUSED const struct PragmaName *pragma,
 		      const char *tbl_name, const char *idx_name)
 {
 	if (idx_name == NULL || tbl_name == NULL)
@@ -239,12 +223,51 @@ sql_pragma_index_info(struct Parse *parse,
 }
 
 /**
+ * This function handles PRAGMA collation_list.
+ *
+ * Return a list of available collations.
+ *
+ * - seqno: Zero-based column id within the index.
+ * - name: Collation name.
+ *
+ * @param parse_context Current parsing content.
+ */
+static void
+sql_pragma_collation_list(struct Parse *parse_context)
+{
+	struct Vdbe *v = sqlGetVdbe(parse_context);
+	assert(v != NULL);
+	/* 16 is enough to encode 0 len array */
+	char key_buf[16];
+	char *key_end = mp_encode_array(key_buf, 0);
+	box_tuple_t *tuple;
+	box_iterator_t *it = box_index_iterator(BOX_COLLATION_ID, 0, ITER_ALL,
+						key_buf, key_end);
+	if (it == NULL) {
+		parse_context->is_aborted = true;
+		return;
+	}
+	int rc = box_iterator_next(it, &tuple);
+	assert(rc == 0);
+	(void) rc;
+	for (int i = 0; tuple != NULL; i++, box_iterator_next(it, &tuple)) {
+		const char *str = tuple_field_cstr(tuple,
+						   BOX_COLLATION_FIELD_NAME);
+		assert(str != NULL);
+		/* this procedure should reallocate and copy str */
+		sqlVdbeMultiLoad(v, 1, "is", i, str);
+		sqlVdbeAddOp2(v, OP_ResultRow, 1, 2);
+	}
+	box_iterator_free(it);
+}
+
+/**
  * This function handles PRAGMA INDEX_LIST statement.
  *
  * @param parse Current parsing content.
  * @param table_name Name of table to display list of indexes.
  */
-void
+static void
 sql_pragma_index_list(struct Parse *parse, const char *tbl_name)
 {
 	if (tbl_name == NULL)
@@ -262,156 +285,119 @@ sql_pragma_index_list(struct Parse *parse, const char *tbl_name)
 	}
 }
 
-/*
- * Process a pragma statement.
- *
- * Pragmas are of this form:
- *
- *      PRAGMA [schema.]id [= value]
- *
- * The identifier might also be a string.  The value is a string, and
- * identifier, or a number.  If minusFlag is true, then the value is
- * a number that was preceded by a minus sign.
+/**
+ * This function handles PRAGMA foreign_key_list(<table>).
  *
- * If the left side is "database.id" then pId1 is the database name
- * and pId2 is the id.  If the left side is just "id" then pId1 is the
- * id and pId2 is any empty string.
+ * @param parse_context Current parsing content.
+ * @param table_name Name of table to display list of FK.
  */
+static void
+sql_pragma_foreign_key_list(struct Parse *parse_context, const char *table_name)
+{
+	if (table_name == NULL)
+		return;
+	struct space *space = space_by_name(table_name);
+	if (space == NULL)
+		return;
+	struct Vdbe *v = sqlGetVdbe(parse_context);
+	assert(v != NULL);
+	int i = 0;
+	parse_context->nMem = 8;
+	struct fk_constraint *fk_c;
+	rlist_foreach_entry(fk_c, &space->child_fk_constraint, in_child_space) {
+		struct fk_constraint_def *fk_def = fk_c->def;
+		struct space *parent = space_by_id(fk_def->parent_id);
+		assert(parent != NULL);
+		const char *on_delete_action =
+			fk_constraint_action_strs[fk_def->on_delete];
+		const char *on_update_action =
+			fk_constraint_action_strs[fk_def->on_update];
+		for (uint32_t j = 0; j < fk_def->field_count; j++) {
+			uint32_t ch_fl = fk_def->links[j].child_field;
+			const char *child_col = space->def->fields[ch_fl].name;
+			uint32_t pr_fl = fk_def->links[j].parent_field;
+			const char *parent_col =
+				parent->def->fields[pr_fl].name;
+			sqlVdbeMultiLoad(v, 1, "iissssss", i, j,
+					 parent->def->name, child_col,
+					 parent_col, on_delete_action,
+					 on_update_action, "NONE");
+			sqlVdbeAddOp2(v, OP_ResultRow, 1, 8);
+		}
+		++i;
+	}
+}
+
 void
-sqlPragma(Parse * pParse, Token * pId,	/* First part of [schema.]id field */
-	      Token * pValue,	/* Token for <value>, or NULL */
-	      Token * pValue2,	/* Token for <value2>, or NULL */
-	      int minusFlag	/* True if a '-' sign preceded <value> */
-    )
+sqlPragma(struct Parse *pParse, struct Token *pragma, struct Token *table,
+	  struct Token *index)
 {
-	char *zLeft = 0;	/* Nul-terminated UTF-8 string <id> */
-	char *zRight = 0;	/* Nul-terminated UTF-8 string <value>, or NULL */
-	char *zTable = 0;	/* Nul-terminated UTF-8 string <value2> or NULL */
-	sql *db = pParse->db;	/* The database connection */
-	Vdbe *v = sqlGetVdbe(pParse);	/* Prepared statement */
-	const PragmaName *pPragma;	/* The pragma */
+	char *table_name = NULL;
+	char *index_name = NULL;
+	struct sql *db = pParse->db;
+	struct Vdbe *v = sqlGetVdbe(pParse);
 
-	if (v == 0)
+	if (v == NULL)
 		return;
 	sqlVdbeRunOnlyOnce(v);
 	pParse->nMem = 2;
 
-	zLeft = sql_name_from_token(db, pId);
-	if (zLeft == NULL) {
+	char *pragma_name = sql_name_from_token(db, pragma);
+	if (pragma_name == NULL) {
 		pParse->is_aborted = true;
 		goto pragma_out;
 	}
-	if (minusFlag) {
-		zRight = sqlMPrintf(db, "-%T", pValue);
-	} else if (pValue != NULL) {
-		zRight = sql_name_from_token(db, pValue);
-		if (zRight == NULL) {
+	if (table != NULL) {
+		table_name = sql_name_from_token(db, table);
+		if (table_name == NULL) {
 			pParse->is_aborted = true;
 			goto pragma_out;
 		}
 	}
-	if (pValue2 != NULL) {
-		zTable = sql_name_from_token(db, pValue2);
-		if (zTable == NULL) {
+	if (index != NULL) {
+		index_name = sql_name_from_token(db, index);
+		if (index_name == NULL) {
 			pParse->is_aborted = true;
 			goto pragma_out;
 		}
 	}
+
 	/* Locate the pragma in the lookup table */
-	pPragma = pragmaLocate(zLeft);
+	const struct PragmaName *pPragma = pragmaLocate(pragma_name);
 	if (pPragma == 0) {
-		diag_set(ClientError, ER_SQL_NO_SUCH_PRAGMA, zLeft);
+		diag_set(ClientError, ER_SQL_NO_SUCH_PRAGMA, pragma_name);
 		pParse->is_aborted = true;
 		goto pragma_out;
 	}
 	/* Register the result column names for pragmas that return results */
 	vdbe_set_pragma_result_columns(v, pPragma);
+
 	/* Jump to the appropriate pragma handler */
 	switch (pPragma->ePragTyp) {
-
-	case PragTyp_TABLE_INFO:
-		sql_pragma_table_info(pParse, zRight);
+	case PRAGMA_TABLE_INFO:
+		sql_pragma_table_info(pParse, table_name);
 		break;
-	case PragTyp_STATS:
+	case PRAGMA_STATS:
 		space_foreach(sql_pragma_table_stats, (void *) pParse);
 		break;
-	case PragTyp_INDEX_INFO:
-		sql_pragma_index_info(pParse, pPragma, zTable, zRight);
+	case PRAGMA_INDEX_INFO:
+		sql_pragma_index_info(pParse, pPragma, index_name, table_name);
 		break;
-	case PragTyp_INDEX_LIST:
-		sql_pragma_index_list(pParse, zRight);
+	case PRAGMA_INDEX_LIST:
+		sql_pragma_index_list(pParse, table_name);
 		break;
-
-	case PragTyp_COLLATION_LIST:{
-		int i = 0;
-		struct space *space = space_by_name("_collation");
-		char key_buf[16]; /* 16 is enough to encode 0 len array */
-		char *key_end = key_buf;
-		key_end = mp_encode_array(key_end, 0);
-		box_tuple_t *tuple;
-		box_iterator_t* iter;
-		iter = box_index_iterator(space->def->id, 0,ITER_ALL, key_buf, key_end);
-		if (iter == NULL) {
-			pParse->is_aborted = true;
-			goto pragma_out;
-		}
-		int rc = box_iterator_next(iter, &tuple);
-		(void) rc;
-		assert(rc == 0);
-		for (i = 0; tuple!=NULL; i++, box_iterator_next(iter, &tuple)){
-			/* 1 is name field number */
-			const char *str = tuple_field_cstr(tuple, 1);
-			assert(str != NULL);
-			/* this procedure should reallocate and copy str */
-			sqlVdbeMultiLoad(v, 1, "is", i, str);
-			sqlVdbeAddOp2(v, OP_ResultRow, 1, 2);
-		}
-		box_iterator_free(iter);
+	case PRAGMA_COLLATION_LIST:
+		sql_pragma_collation_list(pParse);
 		break;
-	}
-
-	case PragTyp_FOREIGN_KEY_LIST:{
-		if (zRight == NULL)
-			break;
-		struct space *space = space_by_name(zRight);
-		if (space == NULL)
-			break;
-		int i = 0;
-		pParse->nMem = 8;
-		struct fk_constraint *fk_c;
-		rlist_foreach_entry(fk_c, &space->child_fk_constraint,
-				    in_child_space) {
-
-			struct fk_constraint_def *fk_def = fk_c->def;
-			for (uint32_t j = 0; j < fk_def->field_count; j++) {
-				struct space *parent =
-					space_by_id(fk_def->parent_id);
-				assert(parent != NULL);
-				uint32_t ch_fl = fk_def->links[j].child_field;
-				const char *child_col =
-					space->def->fields[ch_fl].name;
-				uint32_t pr_fl = fk_def->links[j].parent_field;
-				const char *parent_col =
-					parent->def->fields[pr_fl].name;
-				sqlVdbeMultiLoad(v, 1, "iissssss", i, j,
-						     parent->def->name,
-						     child_col, parent_col,
-						     fk_constraint_action_strs[fk_def->on_delete],
-						     fk_constraint_action_strs[fk_def->on_update],
-						     "NONE");
-				sqlVdbeAddOp2(v, OP_ResultRow, 1, 8);
-			}
-			++i;
-		}
+	case PRAGMA_FOREIGN_KEY_LIST:
+		sql_pragma_foreign_key_list(pParse, table_name);
 		break;
-	}
-
 	default:
 		unreachable();
-	}			/* End of the PRAGMA switch */
+	}
 
  pragma_out:
-	sqlDbFree(db, zLeft);
-	sqlDbFree(db, zRight);
-	sqlDbFree(db, zTable);
+	sqlDbFree(db, pragma_name);
+	sqlDbFree(db, table_name);
+	sqlDbFree(db, index_name);
 }
diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h
index 6c66d97..f319272 100644
--- a/src/box/sql/pragma.h
+++ b/src/box/sql/pragma.h
@@ -1,23 +1,13 @@
-/* DO NOT EDIT!
- * This file is automatically generated by the script at
- * ../tool/mkpragmatab.tcl.  To update the set of pragmas, edit
- * that script and rerun it.
- */
-
-/* The various pragma types */
-#define PragTyp_COLLATION_LIST                 3
-#define PragTyp_FOREIGN_KEY_LIST               9
-#define PragTyp_INDEX_INFO                    10
-#define PragTyp_INDEX_LIST                    11
-#define PragTyp_STATS                         15
-#define PragTyp_TABLE_INFO                    17
-
-/* Property flags associated with various pragma. */
-#define PragFlg_NeedSchema 0x01	/* Force schema load before running */
-#define PragFlg_Result0    0x10	/* Acts as query when no argument */
-#define PragFlg_Result1    0x20	/* Acts as query when has one argument */
-#define PragFlg_SchemaOpt  0x40	/* Schema restricts name search if present */
-#define PragFlg_SchemaReq  0x80	/* Schema required - "main" is default */
+/** List of ID of pragmas. */
+enum
+{
+	PRAGMA_COLLATION_LIST = 0,
+	PRAGMA_FOREIGN_KEY_LIST,
+	PRAGMA_INDEX_INFO,
+	PRAGMA_INDEX_LIST,
+	PRAGMA_STATS,
+	PRAGMA_TABLE_INFO,
+};
 
 /**
  * Column names and types for pragmas. The type of the column is
@@ -90,54 +80,27 @@ static const char *const pragCName[] = {
 	/*  57 */ "text",
 };
 
-/* Definitions of all built-in pragmas */
-typedef struct PragmaName {
-	const char *const zName;	/* Name of pragma */
-	u8 ePragTyp;		/* PragTyp_XXX value */
-	u8 mPragFlg;		/* Zero or more PragFlg_XXX values */
-	u8 iPragCName;		/* Start of column names in pragCName[] */
-	u8 nPragCName;		/* Num of col names. */
-	u32 iArg;		/* Extra argument */
-} PragmaName;
+/** Definitions of all built-in pragmas */
+struct PragmaName {
+	/** Name of pragma. */
+	const char *const zName;
+	/** Id of pragma. */
+	u8 ePragTyp;
+	/** Start of column names in pragCName[] */
+	u8 iPragCName;
+	/** Number of column names. */
+	u8 nPragCName;
+};
+
 /**
  * The order of pragmas in this array is important: it has
  * to be sorted. For more info see pragma_locate function.
  */
-static const PragmaName aPragmaName[] = {
-	{ /* zName:     */ "collation_list",
-	 /* ePragTyp:  */ PragTyp_COLLATION_LIST,
-	 /* ePragFlg:  */ PragFlg_Result0,
-	 /* ColNames:  */ 38, 2,
-	 /* iArg:      */ 0},
-	{ /* zName:     */ "foreign_key_list",
-	 /* ePragTyp:  */ PragTyp_FOREIGN_KEY_LIST,
-	 /* ePragFlg:  */
-	 PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt,
-	 /* ColNames:  */ 42, 8,
-	 /* iArg:      */ 0},
-	{ /* zName:     */ "index_info",
-	 /* ePragTyp:  */ PragTyp_INDEX_INFO,
-	 /* ePragFlg:  */
-	 PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt,
-	 /* ColNames:  */ 20, 6,
-	 /* iArg:      */ 1},
-	{ /* zName:     */ "index_list",
-	 /* ePragTyp:  */ PragTyp_INDEX_LIST,
-	 /* ePragFlg:  */
-	 PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt,
-	 /* ColNames:  */ 32, 3,
-	 /* iArg:      */ 0},
-	{ /* zName:     */ "stats",
-	 /* ePragTyp:  */ PragTyp_STATS,
-	 /* ePragFlg:  */
-	 PragFlg_NeedSchema | PragFlg_Result0 | PragFlg_SchemaReq,
-	 /* ColNames:  */ 12, 4,
-	 /* iArg:      */ 0},
-	{ /* zName:     */ "table_info",
-	 /* ePragTyp:  */ PragTyp_TABLE_INFO,
-	 /* ePragFlg:  */
-	 PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt,
-	 /* ColNames:  */ 0, 6,
-	 /* iArg:      */ 0},
+static const struct PragmaName aPragmaName[] = {
+	{"collation_list", PRAGMA_COLLATION_LIST, 38, 2},
+	{"foreign_key_list", PRAGMA_FOREIGN_KEY_LIST, 42, 8},
+	{"index_info", PRAGMA_INDEX_INFO, 20, 6},
+	{"index_list", PRAGMA_INDEX_LIST, 32, 3},
+	{"stats", PRAGMA_STATS, 12, 4},
+	{"table_info", PRAGMA_TABLE_INFO, 0, 6},
 };
-/* Number of pragmas: 36 on by default, 47 total. */
diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h
index 15dc374..d1fcf47 100644
--- a/src/box/sql/sqlInt.h
+++ b/src/box/sql/sqlInt.h
@@ -2789,7 +2789,22 @@ void sqlExprListSetSpan(Parse *, ExprList *, ExprSpan *);
 u32 sqlExprListFlags(const ExprList *);
 int sqlInit(sql *);
 
-void sqlPragma(Parse *, Token *, Token *, Token *, int);
+/*
+ * Process a pragma statement.
+ *
+ * Pragmas are of this form:
+ * PRAGMA <pragma_name>;
+ * PRAGMA <pragma_name>(<table_name>);
+ * PRAGMA <pragma_name>(<table_name>.<index_name>);
+ *
+ * @param pParse Parse context.
+ * @param pragma Name of the pragma.
+ * @param table Name of the table.
+ * @param index Name of the index.
+ */
+void
+sqlPragma(struct Parse *pParse, struct Token *pragma, struct Token *table,
+	  struct Token *index);
 
 /**
  * Return true if given column is part of primary key.
diff --git a/test/sql-tap/index-info.test.lua b/test/sql-tap/index-info.test.lua
index a1402ee..b5e693b 100755
--- a/test/sql-tap/index-info.test.lua
+++ b/test/sql-tap/index-info.test.lua
@@ -26,7 +26,7 @@ test:do_catchsql_test(
     "index-info-1.2",
     "PRAGMA index_info = t1.a;",
     {
-        1, "Syntax error at line 1 near '.'",
+        1, "Syntax error at line 1 near '='",
     })
 
 -- Case: single column index with an integer column.
-- 
2.7.4

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Tarantool-patches] [PATCH v2 3/9] sql: remove PRAGMA "sql_compound_select_limit"
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 3/9] sql: remove PRAGMA "sql_compound_select_limit" imeevma
@ 2019-12-30 23:11   ` Nikita Pettik
  2019-12-31  4:14     ` Mergen Imeev
  0 siblings, 1 reply; 17+ messages in thread
From: Nikita Pettik @ 2019-12-30 23:11 UTC (permalink / raw)
  To: imeevma; +Cc: tarantool-patches

On 30 Dec 19:43, imeevma@tarantool.org wrote:
> diff --git a/test/sql-tap/suite.ini b/test/sql-tap/suite.ini
> index 8f3c3ea..2e8411d 100644
> --- a/test/sql-tap/suite.ini
> +++ b/test/sql-tap/suite.ini
> @@ -21,6 +21,7 @@ disabled = selectA.test.lua ;
>             analyzeE.test.lua ;
>             analyzeF.test.lua ;
>             gh-3350-skip-scan.test.lua ;
> +           gh2548-select-compound-limit.test.lua ;

This test is not only about pragma itself. Please, don't disable
it but instead refactor.
 
>  lua_libs = lua/sqltester.lua ../sql/lua/sql_tokenizer.lua ../box/lua/identifier.lua
>  is_parallel = True
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Tarantool-patches] [PATCH v2 2/9] sql: remove PRAGMA "short_column_names"
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 2/9] sql: remove PRAGMA "short_column_names" imeevma
@ 2019-12-30 23:12   ` Nikita Pettik
  2019-12-31  4:15     ` Mergen Imeev
  0 siblings, 1 reply; 17+ messages in thread
From: Nikita Pettik @ 2019-12-30 23:12 UTC (permalink / raw)
  To: imeevma; +Cc: tarantool-patches

On 30 Dec 19:43, imeevma@tarantool.org wrote:
> @@ -1828,11 +1825,12 @@ generate_column_metadata(struct Parse *pParse, struct SrcList *pTabList,
>  			struct space_def *space_def = space->def;
>  			assert(iCol >= 0 && iCol < (int)space_def->field_count);
>  			zCol = space_def->fields[iCol].name;
> -			const char *name = colname;
> -			if (name == NULL) {
> -				if (!shortNames && !fullNames) {
> -					name = span;
> -				} else if (fullNames) {
> +			const char *name = NULL;
> +			if (pEList->a[i].zName != NULL) {
> +				name = pEList->a[i].zName;
> +			} else {
> +				int flags = pParse->sql_flags;
> +				if ((flags & SQL_FullColNames) != 0) {
>  					name = tt_sprintf("%s.%s",
>  							  space_def->name,

Please, apply this refactoring:

diff --git a/src/box/sql/select.c b/src/box/sql/select.c
index 0fc86e550..65e41f219 100644
--- a/src/box/sql/select.c
+++ b/src/box/sql/select.c
@@ -1825,10 +1825,8 @@ generate_column_metadata(struct Parse *pParse, struct SrcList *pTabList,
                        struct space_def *space_def = space->def;
                        assert(iCol >= 0 && iCol < (int)space_def->field_count);
                        zCol = space_def->fields[iCol].name;
-                       const char *name = NULL;
-                       if (pEList->a[i].zName != NULL) {
-                               name = pEList->a[i].zName;
-                       } else {
+                       const char *name = colname;
+                       if (name == NULL) {

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
                   ` (8 preceding siblings ...)
  2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 9/9] sql: refactor PRAGMA-related code imeevma
@ 2019-12-30 23:31 ` Nikita Pettik
  2019-12-31  4:16   ` Mergen Imeev
  2019-12-31  8:01 ` Kirill Yukhin
  10 siblings, 1 reply; 17+ messages in thread
From: Nikita Pettik @ 2019-12-30 23:31 UTC (permalink / raw)
  To: imeevma; +Cc: tarantool-patches

On 30 Dec 19:43, imeevma@tarantool.org wrote:
> This patch-set removes control pragmas.
> 
> https://github.com/tarantool/tarantool/issues/4511
> https://github.com/tarantool/tarantool/tree/imeevma/gh-4511-replace-pragma-by-set

In general it looks ok to me. I see tmp commit at the top of your
branch saying that it should be removed after test-run is updated.
Is test-run patch is about to be pushed?
 
> Mergen Imeev (9):
>   sql: remove PRAGMA "count_changes"
>   sql: remove PRAGMA "short_column_names"
>   sql: remove PRAGMA "sql_compound_select_limit"
>   sql: remove PRAGMA "vdbe_addoptrace"
>   box: introduce 'service' engine
>   box: introduce _session_settings system space
>   box: add SQL settings to _session_settings
>   sql: remove control pragmas
>   sql: refactor PRAGMA-related code
> 
>  src/box/CMakeLists.txt                             |   2 +
>  src/box/bootstrap.snap                             | Bin 5921 -> 5976 bytes
>  src/box/box.cc                                     |   4 +
>  src/box/errcode.h                                  |   1 +
>  src/box/lua/space.cc                               |   2 +
>  src/box/lua/upgrade.lua                            |  15 +
>  src/box/schema_def.h                               |   8 +
>  src/box/service_engine.c                           | 135 ++++++
>  src/box/service_engine.h                           |  53 +++
>  src/box/session_settings.c                         | 472 +++++++++++++++++++++
>  src/box/session_settings.h                         |  70 +++
>  src/box/sql.c                                      |   8 +-
>  src/box/sql/build.c                                | 194 +++++++++
>  src/box/sql/delete.c                               |  24 --
>  src/box/sql/expr.c                                 |  15 -
>  src/box/sql/insert.c                               |  34 +-
>  src/box/sql/parse.y                                |  34 +-
>  src/box/sql/pragma.c                               | 447 +++++--------------
>  src/box/sql/pragma.h                               | 253 ++---------
>  src/box/sql/select.c                               |  20 +-
>  src/box/sql/sqlInt.h                               |  25 +-
>  src/box/sql/update.c                               |  25 --
>  src/box/sql/util.c                                 |  15 -
>  src/box/sql/vdbe.c                                 |  33 +-
>  src/box/sql/vdbe.h                                 |   5 -
>  src/box/sql/vdbeaux.c                              |  39 +-
>  test/app-tap/tarantoolctl.test.lua                 |   4 +-
>  test/box-py/bootstrap.result                       |   3 +
>  test/box/access_sysview.result                     |   6 +-
>  test/box/alter.result                              |   5 +-
>  ...h-4511-access-settings-from-any-frontend.result | 286 +++++++++++++
>  ...4511-access-settings-from-any-frontend.test.lua | 108 +++++
>  test/box/misc.result                               |   1 +
>  test/box/sql-update-with-nested-select.result      |   2 -
>  test/box/sql-update-with-nested-select.test.lua    |   3 -
>  test/sql-tap/autoinc.test.lua                      |   3 +-
>  test/sql-tap/colname.test.lua                      |  51 +--
>  test/sql-tap/fkey2.test.lua                        |   4 +-
>  test/sql-tap/index-info.test.lua                   |   2 +-
>  test/sql-tap/lua/sqltester.lua                     |   2 +-
>  test/sql-tap/misc1.test.lua                        |   2 +-
>  test/sql-tap/pragma.test.lua                       | 135 +-----
>  test/sql-tap/select1.test.lua                      |  55 +--
>  test/sql-tap/suite.ini                             |   1 +
>  test/sql-tap/tkt3731.test.lua                      |   2 +-
>  test/sql-tap/trigger2.test.lua                     |   3 +-
>  test/sql-tap/triggerC.test.lua                     |  65 +--
>  test/sql-tap/update.test.lua                       |  49 ++-
>  test/sql-tap/whereA.test.lua                       |  24 +-
>  test/sql/check-clear-ephemeral.result              |   5 +-
>  test/sql/check-clear-ephemeral.test.lua            |   5 +-
>  test/sql/checks.result                             |  10 +-
>  test/sql/checks.test.lua                           |   4 +-
>  test/sql/clear.result                              |   5 +-
>  test/sql/clear.test.lua                            |   5 +-
>  test/sql/collation.result                          |   3 +-
>  test/sql/collation.test.lua                        |   2 +-
>  test/sql/constraint.result                         |   3 +-
>  test/sql/constraint.test.lua                       |   2 +-
>  test/sql/ddl.result                                |   3 +-
>  test/sql/ddl.test.lua                              |   2 +-
>  test/sql/delete-multiple-idx.result                |   5 +-
>  test/sql/delete-multiple-idx.test.lua              |   5 +-
>  test/sql/delete.result                             |   5 +-
>  test/sql/delete.test.lua                           |   5 +-
>  test/sql/drop-index.result                         |   5 +-
>  test/sql/drop-index.test.lua                       |   5 +-
>  test/sql/drop-table.result                         |   5 +-
>  test/sql/drop-table.test.lua                       |   5 +-
>  test/sql/engine.cfg                                |   3 -
>  test/sql/engine.result                             |  12 +-
>  test/sql/engine.test.lua                           |   6 +-
>  test/sql/errinj.result                             |   3 +-
>  test/sql/errinj.test.lua                           |   2 +-
>  test/sql/full_metadata.result                      |   8 +-
>  test/sql/full_metadata.test.lua                    |   4 +-
>  test/sql/func-recreate.result                      |   3 +-
>  test/sql/func-recreate.test.lua                    |   2 +-
>  test/sql/gh-2362-select-access-rights.result       |   5 +-
>  test/sql/gh-2362-select-access-rights.test.lua     |   2 +-
>  test/sql/gh-2929-primary-key.result                |   3 +-
>  test/sql/gh-2929-primary-key.test.lua              |   2 +-
>  test/sql/gh-2981-check-autoinc.result              |   3 +-
>  test/sql/gh-2981-check-autoinc.test.lua            |   2 +-
>  test/sql/gh-3199-no-mem-leaks.result               |   3 +-
>  test/sql/gh-3199-no-mem-leaks.test.lua             |   2 +-
>  test/sql/gh-3613-idx-alter-update-2.result         |   3 +-
>  test/sql/gh-3613-idx-alter-update-2.test.lua       |   2 +-
>  test/sql/gh-3613-idx-alter-update.result           |   3 +-
>  test/sql/gh-3613-idx-alter-update.test.lua         |   2 +-
>  test/sql/gh-3888-values-blob-assert.result         |   3 +-
>  test/sql/gh-3888-values-blob-assert.test.lua       |   2 +-
>  test/sql/gh2141-delete-trigger-drop-table.result   |   3 +-
>  test/sql/gh2141-delete-trigger-drop-table.test.lua |   2 +-
>  test/sql/gh2251-multiple-update.result             |   3 +-
>  test/sql/gh2251-multiple-update.test.lua           |   2 +-
>  test/sql/gh2483-remote-persistency-check.result    |   3 +-
>  test/sql/gh2483-remote-persistency-check.test.lua  |   2 +-
>  .../gh2808-inline-unique-persistency-check.result  |   3 +-
>  ...gh2808-inline-unique-persistency-check.test.lua |   2 +-
>  test/sql/icu-upper-lower.result                    |   3 +-
>  test/sql/icu-upper-lower.test.lua                  |   2 +-
>  test/sql/insert-unique.result                      |   5 +-
>  test/sql/insert-unique.test.lua                    |   5 +-
>  test/sql/integer-overflow.result                   |   3 +-
>  test/sql/integer-overflow.test.lua                 |   2 +-
>  test/sql/iproto.result                             |  34 +-
>  test/sql/iproto.test.lua                           |  10 +-
>  test/sql/max-on-index.result                       |   5 +-
>  test/sql/max-on-index.test.lua                     |   5 +-
>  test/sql/message-func-indexes.result               |   3 +-
>  test/sql/message-func-indexes.test.lua             |   2 +-
>  test/sql/misc.result                               |   3 +-
>  test/sql/misc.test.lua                             |   2 +-
>  test/sql/no-pk-space.result                        |   3 +-
>  test/sql/no-pk-space.test.lua                      |   2 +-
>  test/sql/on-conflict.result                        |   3 +-
>  test/sql/on-conflict.test.lua                      |   2 +-
>  test/sql/persistency.result                        |   3 +-
>  test/sql/persistency.test.lua                      |   2 +-
>  test/sql/row-count.result                          |  11 +-
>  test/sql/row-count.test.lua                        |   4 +-
>  test/sql/savepoints.result                         |   3 +-
>  test/sql/savepoints.test.lua                       |   2 +-
>  test/sql/select-null.result                        |   5 +-
>  test/sql/select-null.test.lua                      |   5 +-
>  test/sql/sql-debug.result                          |  57 ---
>  test/sql/sql-debug.test.lua                        |  17 -
>  test/sql/sql-statN-index-drop.test.lua             |   2 +-
>  test/sql/suite.ini                                 |   2 +-
>  test/sql/tokenizer.result                          |   3 +-
>  test/sql/tokenizer.test.lua                        |   2 +-
>  test/sql/transition.result                         |   3 +-
>  test/sql/transition.test.lua                       |   2 +-
>  test/sql/transitive-transactions.result            |   9 +-
>  test/sql/transitive-transactions.test.lua          |   9 +-
>  test/sql/triggers.result                           |  27 +-
>  test/sql/triggers.test.lua                         |  14 +-
>  test/sql/update-with-nested-select.result          |   5 +-
>  test/sql/update-with-nested-select.test.lua        |   5 +-
>  test/sql/upgrade.result                            |   3 +-
>  test/sql/upgrade.test.lua                          |   2 +-
>  test/sql/view.result                               |   3 +-
>  test/sql/view.test.lua                             |   2 +-
>  test/sql/view_delayed_wal.result                   |   3 +-
>  test/sql/view_delayed_wal.test.lua                 |   2 +-
>  test/sql/vinyl-opts.result                         |   4 +-
>  test/sql/vinyl-opts.test.lua                       |   2 +-
>  test/wal_off/alter.result                          |   2 +-
>  149 files changed, 1775 insertions(+), 1472 deletions(-)
>  create mode 100644 src/box/service_engine.c
>  create mode 100644 src/box/service_engine.h
>  create mode 100644 src/box/session_settings.c
>  create mode 100644 src/box/session_settings.h
>  create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.result
>  create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.test.lua
>  delete mode 100644 test/sql/sql-debug.result
>  delete mode 100644 test/sql/sql-debug.test.lua
> 
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Tarantool-patches] [PATCH v2 3/9] sql: remove PRAGMA "sql_compound_select_limit"
  2019-12-30 23:11   ` Nikita Pettik
@ 2019-12-31  4:14     ` Mergen Imeev
  0 siblings, 0 replies; 17+ messages in thread
From: Mergen Imeev @ 2019-12-31  4:14 UTC (permalink / raw)
  To: Nikita Pettik; +Cc: tarantool-patches

Hi! Thank you for review! My answer and diff below.

On Tue, Dec 31, 2019 at 01:11:22AM +0200, Nikita Pettik wrote:
> On 30 Dec 19:43, imeevma@tarantool.org wrote:
> > diff --git a/test/sql-tap/suite.ini b/test/sql-tap/suite.ini
> > index 8f3c3ea..2e8411d 100644
> > --- a/test/sql-tap/suite.ini
> > +++ b/test/sql-tap/suite.ini
> > @@ -21,6 +21,7 @@ disabled = selectA.test.lua ;
> >             analyzeE.test.lua ;
> >             analyzeF.test.lua ;
> >             gh-3350-skip-scan.test.lua ;
> > +           gh2548-select-compound-limit.test.lua ;
> 
> This test is not only about pragma itself. Please, don't disable
> it but instead refactor.
>  
Fixed.

> >  lua_libs = lua/sqltester.lua ../sql/lua/sql_tokenizer.lua ../box/lua/identifier.lua
> >  is_parallel = True
> > -- 
> > 2.7.4
> > 

Diff:

diff --git a/test/sql-tap/gh2548-select-compound-limit.test.lua b/test/sql-tap/gh2548-select-compound-limit.test.lua
index f578870..76769d6 100755
--- a/test/sql-tap/gh2548-select-compound-limit.test.lua
+++ b/test/sql-tap/gh2548-select-compound-limit.test.lua
@@ -1,6 +1,6 @@
 #!/usr/bin/env tarantool
 test = require("sqltester")
-test:plan(14)
+test:plan(9)
 
 -- box.cfg{wal_mode='none'}
 
@@ -62,47 +62,4 @@ test:do_catchsql_test(
         -- </gh2548-select-compound-limit-2>
     })
 
-test:do_execsql_test(
-    "gh2548-select-compound-limit-3.1", [[
-        pragma sql_compound_select_limit
-    ]], {
-        -- <gh2548-select-compound-limit-3.1>
-        30
-        -- </gh2548-select-compound-limit-3.1>
-    })
-
-test:do_execsql_test(
-    "gh2548-select-compound-limit-3.2", [[
-        pragma sql_compound_select_limit=31
-    ]], {
-        -- <gh2548-select-compound-limit-3.2>
-        31
-        -- </gh2548-select-compound-limit-3.2>
-})
-
-test:do_execsql_test(
-    "gh2548-select-compound-limit-3.3",
-    select_string_last, {
-        -- <gh2548-select-compound-limit-3.3>
-        0, 1
-        -- </gh2548-select-compound-limit-3.3>
-    })
-
-test:do_execsql_test(
-    "gh2548-select-compound-limit-3.4", [[
-        pragma sql_compound_select_limit=0
-    ]], {
-        -- <gh2548-select-compound-limit-3.4>
-        0
-        -- </gh2548-select-compound-limit-3.4>
-    })
-
-test:do_execsql_test(
-    "gh2548-select-compound-limit-3.3",
-    select_string_last, {
-        -- <gh2548-select-compound-limit-3.3>
-        0, 1
-        -- </gh2548-select-compound-limit-3.3>
-    })
-
 test:finish_test()
diff --git a/test/sql-tap/suite.ini b/test/sql-tap/suite.ini
index 2e8411d..8f3c3ea 100644
--- a/test/sql-tap/suite.ini
+++ b/test/sql-tap/suite.ini
@@ -21,7 +21,6 @@ disabled = selectA.test.lua ;
            analyzeE.test.lua ;
            analyzeF.test.lua ;
            gh-3350-skip-scan.test.lua ;
-           gh2548-select-compound-limit.test.lua ;
 
 lua_libs = lua/sqltester.lua ../sql/lua/sql_tokenizer.lua ../box/lua/identifier.lua
 is_parallel = True

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Tarantool-patches] [PATCH v2 2/9] sql: remove PRAGMA "short_column_names"
  2019-12-30 23:12   ` Nikita Pettik
@ 2019-12-31  4:15     ` Mergen Imeev
  0 siblings, 0 replies; 17+ messages in thread
From: Mergen Imeev @ 2019-12-31  4:15 UTC (permalink / raw)
  To: Nikita Pettik; +Cc: tarantool-patches

Thank you for review! Applied the diff.

On Tue, Dec 31, 2019 at 01:12:18AM +0200, Nikita Pettik wrote:
> On 30 Dec 19:43, imeevma@tarantool.org wrote:
> > @@ -1828,11 +1825,12 @@ generate_column_metadata(struct Parse *pParse, struct SrcList *pTabList,
> >  			struct space_def *space_def = space->def;
> >  			assert(iCol >= 0 && iCol < (int)space_def->field_count);
> >  			zCol = space_def->fields[iCol].name;
> > -			const char *name = colname;
> > -			if (name == NULL) {
> > -				if (!shortNames && !fullNames) {
> > -					name = span;
> > -				} else if (fullNames) {
> > +			const char *name = NULL;
> > +			if (pEList->a[i].zName != NULL) {
> > +				name = pEList->a[i].zName;
> > +			} else {
> > +				int flags = pParse->sql_flags;
> > +				if ((flags & SQL_FullColNames) != 0) {
> >  					name = tt_sprintf("%s.%s",
> >  							  space_def->name,
> 
> Please, apply this refactoring:
> 
> diff --git a/src/box/sql/select.c b/src/box/sql/select.c
> index 0fc86e550..65e41f219 100644
> --- a/src/box/sql/select.c
> +++ b/src/box/sql/select.c
> @@ -1825,10 +1825,8 @@ generate_column_metadata(struct Parse *pParse, struct SrcList *pTabList,
>                         struct space_def *space_def = space->def;
>                         assert(iCol >= 0 && iCol < (int)space_def->field_count);
>                         zCol = space_def->fields[iCol].name;
> -                       const char *name = NULL;
> -                       if (pEList->a[i].zName != NULL) {
> -                               name = pEList->a[i].zName;
> -                       } else {
> +                       const char *name = colname;
> +                       if (name == NULL) {
> 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas
  2019-12-30 23:31 ` [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas Nikita Pettik
@ 2019-12-31  4:16   ` Mergen Imeev
  0 siblings, 0 replies; 17+ messages in thread
From: Mergen Imeev @ 2019-12-31  4:16 UTC (permalink / raw)
  To: Nikita Pettik; +Cc: tarantool-patches

On Tue, Dec 31, 2019 at 01:31:44AM +0200, Nikita Pettik wrote:
> On 30 Dec 19:43, imeevma@tarantool.org wrote:
> > This patch-set removes control pragmas.
> > 
> > https://github.com/tarantool/tarantool/issues/4511
> > https://github.com/tarantool/tarantool/tree/imeevma/gh-4511-replace-pragma-by-set
> 
> In general it looks ok to me. I see tmp commit at the top of your
> branch saying that it should be removed after test-run is updated.
> Is test-run patch is about to be pushed?
> 
Yes. I removed the discribed commit since test-run was
updated.

> > Mergen Imeev (9):
> >   sql: remove PRAGMA "count_changes"
> >   sql: remove PRAGMA "short_column_names"
> >   sql: remove PRAGMA "sql_compound_select_limit"
> >   sql: remove PRAGMA "vdbe_addoptrace"
> >   box: introduce 'service' engine
> >   box: introduce _session_settings system space
> >   box: add SQL settings to _session_settings
> >   sql: remove control pragmas
> >   sql: refactor PRAGMA-related code
> > 
> >  src/box/CMakeLists.txt                             |   2 +
> >  src/box/bootstrap.snap                             | Bin 5921 -> 5976 bytes
> >  src/box/box.cc                                     |   4 +
> >  src/box/errcode.h                                  |   1 +
> >  src/box/lua/space.cc                               |   2 +
> >  src/box/lua/upgrade.lua                            |  15 +
> >  src/box/schema_def.h                               |   8 +
> >  src/box/service_engine.c                           | 135 ++++++
> >  src/box/service_engine.h                           |  53 +++
> >  src/box/session_settings.c                         | 472 +++++++++++++++++++++
> >  src/box/session_settings.h                         |  70 +++
> >  src/box/sql.c                                      |   8 +-
> >  src/box/sql/build.c                                | 194 +++++++++
> >  src/box/sql/delete.c                               |  24 --
> >  src/box/sql/expr.c                                 |  15 -
> >  src/box/sql/insert.c                               |  34 +-
> >  src/box/sql/parse.y                                |  34 +-
> >  src/box/sql/pragma.c                               | 447 +++++--------------
> >  src/box/sql/pragma.h                               | 253 ++---------
> >  src/box/sql/select.c                               |  20 +-
> >  src/box/sql/sqlInt.h                               |  25 +-
> >  src/box/sql/update.c                               |  25 --
> >  src/box/sql/util.c                                 |  15 -
> >  src/box/sql/vdbe.c                                 |  33 +-
> >  src/box/sql/vdbe.h                                 |   5 -
> >  src/box/sql/vdbeaux.c                              |  39 +-
> >  test/app-tap/tarantoolctl.test.lua                 |   4 +-
> >  test/box-py/bootstrap.result                       |   3 +
> >  test/box/access_sysview.result                     |   6 +-
> >  test/box/alter.result                              |   5 +-
> >  ...h-4511-access-settings-from-any-frontend.result | 286 +++++++++++++
> >  ...4511-access-settings-from-any-frontend.test.lua | 108 +++++
> >  test/box/misc.result                               |   1 +
> >  test/box/sql-update-with-nested-select.result      |   2 -
> >  test/box/sql-update-with-nested-select.test.lua    |   3 -
> >  test/sql-tap/autoinc.test.lua                      |   3 +-
> >  test/sql-tap/colname.test.lua                      |  51 +--
> >  test/sql-tap/fkey2.test.lua                        |   4 +-
> >  test/sql-tap/index-info.test.lua                   |   2 +-
> >  test/sql-tap/lua/sqltester.lua                     |   2 +-
> >  test/sql-tap/misc1.test.lua                        |   2 +-
> >  test/sql-tap/pragma.test.lua                       | 135 +-----
> >  test/sql-tap/select1.test.lua                      |  55 +--
> >  test/sql-tap/suite.ini                             |   1 +
> >  test/sql-tap/tkt3731.test.lua                      |   2 +-
> >  test/sql-tap/trigger2.test.lua                     |   3 +-
> >  test/sql-tap/triggerC.test.lua                     |  65 +--
> >  test/sql-tap/update.test.lua                       |  49 ++-
> >  test/sql-tap/whereA.test.lua                       |  24 +-
> >  test/sql/check-clear-ephemeral.result              |   5 +-
> >  test/sql/check-clear-ephemeral.test.lua            |   5 +-
> >  test/sql/checks.result                             |  10 +-
> >  test/sql/checks.test.lua                           |   4 +-
> >  test/sql/clear.result                              |   5 +-
> >  test/sql/clear.test.lua                            |   5 +-
> >  test/sql/collation.result                          |   3 +-
> >  test/sql/collation.test.lua                        |   2 +-
> >  test/sql/constraint.result                         |   3 +-
> >  test/sql/constraint.test.lua                       |   2 +-
> >  test/sql/ddl.result                                |   3 +-
> >  test/sql/ddl.test.lua                              |   2 +-
> >  test/sql/delete-multiple-idx.result                |   5 +-
> >  test/sql/delete-multiple-idx.test.lua              |   5 +-
> >  test/sql/delete.result                             |   5 +-
> >  test/sql/delete.test.lua                           |   5 +-
> >  test/sql/drop-index.result                         |   5 +-
> >  test/sql/drop-index.test.lua                       |   5 +-
> >  test/sql/drop-table.result                         |   5 +-
> >  test/sql/drop-table.test.lua                       |   5 +-
> >  test/sql/engine.cfg                                |   3 -
> >  test/sql/engine.result                             |  12 +-
> >  test/sql/engine.test.lua                           |   6 +-
> >  test/sql/errinj.result                             |   3 +-
> >  test/sql/errinj.test.lua                           |   2 +-
> >  test/sql/full_metadata.result                      |   8 +-
> >  test/sql/full_metadata.test.lua                    |   4 +-
> >  test/sql/func-recreate.result                      |   3 +-
> >  test/sql/func-recreate.test.lua                    |   2 +-
> >  test/sql/gh-2362-select-access-rights.result       |   5 +-
> >  test/sql/gh-2362-select-access-rights.test.lua     |   2 +-
> >  test/sql/gh-2929-primary-key.result                |   3 +-
> >  test/sql/gh-2929-primary-key.test.lua              |   2 +-
> >  test/sql/gh-2981-check-autoinc.result              |   3 +-
> >  test/sql/gh-2981-check-autoinc.test.lua            |   2 +-
> >  test/sql/gh-3199-no-mem-leaks.result               |   3 +-
> >  test/sql/gh-3199-no-mem-leaks.test.lua             |   2 +-
> >  test/sql/gh-3613-idx-alter-update-2.result         |   3 +-
> >  test/sql/gh-3613-idx-alter-update-2.test.lua       |   2 +-
> >  test/sql/gh-3613-idx-alter-update.result           |   3 +-
> >  test/sql/gh-3613-idx-alter-update.test.lua         |   2 +-
> >  test/sql/gh-3888-values-blob-assert.result         |   3 +-
> >  test/sql/gh-3888-values-blob-assert.test.lua       |   2 +-
> >  test/sql/gh2141-delete-trigger-drop-table.result   |   3 +-
> >  test/sql/gh2141-delete-trigger-drop-table.test.lua |   2 +-
> >  test/sql/gh2251-multiple-update.result             |   3 +-
> >  test/sql/gh2251-multiple-update.test.lua           |   2 +-
> >  test/sql/gh2483-remote-persistency-check.result    |   3 +-
> >  test/sql/gh2483-remote-persistency-check.test.lua  |   2 +-
> >  .../gh2808-inline-unique-persistency-check.result  |   3 +-
> >  ...gh2808-inline-unique-persistency-check.test.lua |   2 +-
> >  test/sql/icu-upper-lower.result                    |   3 +-
> >  test/sql/icu-upper-lower.test.lua                  |   2 +-
> >  test/sql/insert-unique.result                      |   5 +-
> >  test/sql/insert-unique.test.lua                    |   5 +-
> >  test/sql/integer-overflow.result                   |   3 +-
> >  test/sql/integer-overflow.test.lua                 |   2 +-
> >  test/sql/iproto.result                             |  34 +-
> >  test/sql/iproto.test.lua                           |  10 +-
> >  test/sql/max-on-index.result                       |   5 +-
> >  test/sql/max-on-index.test.lua                     |   5 +-
> >  test/sql/message-func-indexes.result               |   3 +-
> >  test/sql/message-func-indexes.test.lua             |   2 +-
> >  test/sql/misc.result                               |   3 +-
> >  test/sql/misc.test.lua                             |   2 +-
> >  test/sql/no-pk-space.result                        |   3 +-
> >  test/sql/no-pk-space.test.lua                      |   2 +-
> >  test/sql/on-conflict.result                        |   3 +-
> >  test/sql/on-conflict.test.lua                      |   2 +-
> >  test/sql/persistency.result                        |   3 +-
> >  test/sql/persistency.test.lua                      |   2 +-
> >  test/sql/row-count.result                          |  11 +-
> >  test/sql/row-count.test.lua                        |   4 +-
> >  test/sql/savepoints.result                         |   3 +-
> >  test/sql/savepoints.test.lua                       |   2 +-
> >  test/sql/select-null.result                        |   5 +-
> >  test/sql/select-null.test.lua                      |   5 +-
> >  test/sql/sql-debug.result                          |  57 ---
> >  test/sql/sql-debug.test.lua                        |  17 -
> >  test/sql/sql-statN-index-drop.test.lua             |   2 +-
> >  test/sql/suite.ini                                 |   2 +-
> >  test/sql/tokenizer.result                          |   3 +-
> >  test/sql/tokenizer.test.lua                        |   2 +-
> >  test/sql/transition.result                         |   3 +-
> >  test/sql/transition.test.lua                       |   2 +-
> >  test/sql/transitive-transactions.result            |   9 +-
> >  test/sql/transitive-transactions.test.lua          |   9 +-
> >  test/sql/triggers.result                           |  27 +-
> >  test/sql/triggers.test.lua                         |  14 +-
> >  test/sql/update-with-nested-select.result          |   5 +-
> >  test/sql/update-with-nested-select.test.lua        |   5 +-
> >  test/sql/upgrade.result                            |   3 +-
> >  test/sql/upgrade.test.lua                          |   2 +-
> >  test/sql/view.result                               |   3 +-
> >  test/sql/view.test.lua                             |   2 +-
> >  test/sql/view_delayed_wal.result                   |   3 +-
> >  test/sql/view_delayed_wal.test.lua                 |   2 +-
> >  test/sql/vinyl-opts.result                         |   4 +-
> >  test/sql/vinyl-opts.test.lua                       |   2 +-
> >  test/wal_off/alter.result                          |   2 +-
> >  149 files changed, 1775 insertions(+), 1472 deletions(-)
> >  create mode 100644 src/box/service_engine.c
> >  create mode 100644 src/box/service_engine.h
> >  create mode 100644 src/box/session_settings.c
> >  create mode 100644 src/box/session_settings.h
> >  create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.result
> >  create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.test.lua
> >  delete mode 100644 test/sql/sql-debug.result
> >  delete mode 100644 test/sql/sql-debug.test.lua
> > 
> > -- 
> > 2.7.4
> > 

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas
  2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
                   ` (9 preceding siblings ...)
  2019-12-30 23:31 ` [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas Nikita Pettik
@ 2019-12-31  8:01 ` Kirill Yukhin
  10 siblings, 0 replies; 17+ messages in thread
From: Kirill Yukhin @ 2019-12-31  8:01 UTC (permalink / raw)
  To: imeevma; +Cc: tarantool-patches

Hello,

On 30 дек 19:43, imeevma@tarantool.org wrote:
> This patch-set removes control pragmas.
> 
> https://github.com/tarantool/tarantool/issues/4511
> https://github.com/tarantool/tarantool/tree/imeevma/gh-4511-replace-pragma-by-set
> 
> Mergen Imeev (9):
>   sql: remove PRAGMA "count_changes"
>   sql: remove PRAGMA "short_column_names"
>   sql: remove PRAGMA "sql_compound_select_limit"
>   sql: remove PRAGMA "vdbe_addoptrace"
>   box: introduce 'service' engine
>   box: introduce _session_settings system space
>   box: add SQL settings to _session_settings
>   sql: remove control pragmas
>   sql: refactor PRAGMA-related code

I've checked the patchset into master.

--
Regards, Kirill Yukhin

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2019-12-31  8:01 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-30 16:43 [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas imeevma
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 1/9] sql: remove PRAGMA "count_changes" imeevma
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 2/9] sql: remove PRAGMA "short_column_names" imeevma
2019-12-30 23:12   ` Nikita Pettik
2019-12-31  4:15     ` Mergen Imeev
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 3/9] sql: remove PRAGMA "sql_compound_select_limit" imeevma
2019-12-30 23:11   ` Nikita Pettik
2019-12-31  4:14     ` Mergen Imeev
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 4/9] sql: remove PRAGMA "vdbe_addoptrace" imeevma
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 5/9] box: introduce 'service' engine imeevma
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 6/9] box: introduce _session_settings system space imeevma
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 7/9] box: add SQL settings to _session_settings imeevma
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 8/9] sql: remove control pragmas imeevma
2019-12-30 16:43 ` [Tarantool-patches] [PATCH v2 9/9] sql: refactor PRAGMA-related code imeevma
2019-12-30 23:31 ` [Tarantool-patches] [PATCH v2 0/9] sql: Remove control pragmas Nikita Pettik
2019-12-31  4:16   ` Mergen Imeev
2019-12-31  8:01 ` Kirill Yukhin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox