diff --git a/extra/mkkeywordhash.c b/extra/mkkeywordhash.c
index a105cf3c551614ff9275b15921da68258cdd64b4..ccf092b5534dabe2b27722815fa319973d78de0e 100644
--- a/extra/mkkeywordhash.c
+++ b/extra/mkkeywordhash.c
@@ -80,12 +80,12 @@ struct Keyword {
 #  define CONFLICT   0x00000080
 #endif
 #define EXPLAIN      0x00000100
-#ifdef SQLITE_OMIT_FOREIGN_KEY
-#  define FKEY       0
+#define FKEY         0x00000200
+#ifdef SQLITE_OMIT_PRAGMA
+#  define PRAGMA     0
 #else
-#  define FKEY       0x00000200
+#  define PRAGMA     0x00000400
 #endif
-#define PRAGMA       0x00000400
 #ifdef SQLITE_OMIT_REINDEX
 #  define REINDEX    0
 #else
diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c
index 6ecc9300615de16cb40170757281ad17c9d0553c..13cb61ecfa9dffb1f5c29585f19cf023027788ff 100644
--- a/src/box/sql/insert.c
+++ b/src/box/sql/insert.c
@@ -1812,7 +1812,6 @@ xferOptimization(Parse * pParse,	/* Parser context */
 		/* Tables have different CHECK constraints.  Ticket #2252 */
 		return 0;
 	}
-#ifndef SQLITE_OMIT_FOREIGN_KEY
 	/* Disallow the transfer optimization if the destination table constains
 	 * any foreign key constraints.  This is more restrictive than necessary.
 	 * So the extra complication to make this rule less restrictive is probably
@@ -1823,7 +1822,6 @@ xferOptimization(Parse * pParse,	/* Parser context */
 	if ((user_session->sql_flags & SQLITE_ForeignKeys) != 0 &&
 	    !rlist_empty(&dest->child_fkey))
 		return 0;
-#endif
 	if ((user_session->sql_flags & SQLITE_CountRows) != 0) {
 		return 0;	/* xfer opt does not play well with PRAGMA count_changes */
 	}
diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c
index 39cdc29901d724a9852b910b238b4363f4f91f88..f7e6053eb6f6cc97f86d75115970c72f8209d3e7 100644
--- a/src/box/sql/pragma.c
+++ b/src/box/sql/pragma.c
@@ -553,7 +553,6 @@ sqlite3Pragma(Parse * pParse, Token * pId,	/* First part of [schema.]id field */
 	}
 #endif				/* SQLITE_OMIT_SCHEMA_PRAGMAS */
 
-#ifndef SQLITE_OMIT_FOREIGN_KEY
 	case PragTyp_FOREIGN_KEY_LIST:{
 		if (zRight == NULL)
 			break;
@@ -589,7 +588,6 @@ sqlite3Pragma(Parse * pParse, Token * pId,	/* First part of [schema.]id field */
 		}
 		break;
 	}
-#endif				/* !defined(SQLITE_OMIT_FOREIGN_KEY) */
 #ifndef NDEBUG
 	case PragTyp_PARSER_TRACE:{
 			if (zRight) {
diff --git a/src/box/sql/pragma.h b/src/box/sql/pragma.h
index 8c614607e359f25d3caa76474421356b2745b351..ecc9ee879c6f0cfbecb1c479303859c7dbb9a5ad 100644
--- a/src/box/sql/pragma.h
+++ b/src/box/sql/pragma.h
@@ -123,31 +123,25 @@ static const PragmaName aPragmaName[] = {
 	 /* iArg:      */ SQLITE_CountRows},
 #endif
 #if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
-#if !defined(SQLITE_OMIT_FOREIGN_KEY)
 	{ /* zName:     */ "defer_foreign_keys",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
 	 /* ColNames:  */ 0, 0,
 	 /* iArg:      */ SQLITE_DeferFKs},
 #endif
-#endif
-#if !defined(SQLITE_OMIT_FOREIGN_KEY)
 	{ /* zName:     */ "foreign_key_list",
 	 /* ePragTyp:  */ PragTyp_FOREIGN_KEY_LIST,
 	 /* ePragFlg:  */
 	 PragFlg_NeedSchema | PragFlg_Result1 | PragFlg_SchemaOpt,
 	 /* ColNames:  */ 29, 8,
 	 /* iArg:      */ 0},
-#endif
 #if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
-#if !defined(SQLITE_OMIT_FOREIGN_KEY)
 	{ /* zName:     */ "foreign_keys",
 	 /* ePragTyp:  */ PragTyp_FLAG,
 	 /* ePragFlg:  */ PragFlg_Result0 | PragFlg_NoColumns1,
 	 /* ColNames:  */ 0, 0,
 	 /* iArg:      */ SQLITE_ForeignKeys},
 #endif
-#endif
 #if !defined(SQLITE_OMIT_FLAG_PRAGMAS)
 	{ /* zName:     */ "full_column_names",
 	 /* ePragTyp:  */ PragTyp_FLAG,
diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
index 78900c773d78a84c3344bc05a82a278afcd07f1a..dc5146f81f87b08e5082bb510e67d9fb578741d0 100644
--- a/src/box/sql/vdbe.c
+++ b/src/box/sql/vdbe.c
@@ -4858,7 +4858,6 @@ case OP_Param: {           /* out2 */
 	break;
 }
 
-#ifndef SQLITE_OMIT_FOREIGN_KEY
 /* Opcode: FkCounter P1 P2 * * *
  * Synopsis: fkctr[P1]+=P2
  *
@@ -4902,7 +4901,6 @@ case OP_FkIfZero: {         /* jump */
 	}
 	break;
 }
-#endif /* #ifndef SQLITE_OMIT_FOREIGN_KEY */
 
 /* Opcode: IfPos P1 P2 P3 * *
  * Synopsis: if r[P1]>0 then r[P1]-=P3, goto P2
diff --git a/src/box/sql/vdbeInt.h b/src/box/sql/vdbeInt.h
index a4770a50ea616f731448f159b013dd6cc570eab0..ce97f4984e49fd2dafbbe5a62956ce8457f785bd 100644
--- a/src/box/sql/vdbeInt.h
+++ b/src/box/sql/vdbeInt.h
@@ -493,11 +493,7 @@ void sqlite3VdbeMemAboutToChange(Vdbe *, Mem *);
 int sqlite3VdbeCheckMemInvariants(Mem *);
 #endif
 
-#ifndef SQLITE_OMIT_FOREIGN_KEY
 int sqlite3VdbeCheckFk(Vdbe *, int);
-#else
-#define sqlite3VdbeCheckFk(p,i) 0
-#endif
 
 int sqlite3VdbeMemTranslate(Mem *, u8);
 #ifdef SQLITE_DEBUG
diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
index 353b21a96cf276e0a0dd5d18752ec8101dbb7e6c..242a6448ed75194ebb0eaa6b8e75b90098059628 100644
--- a/src/box/sql/vdbeaux.c
+++ b/src/box/sql/vdbeaux.c
@@ -616,11 +616,9 @@ sqlite3VdbeAssertMayAbort(Vdbe * v, int mayAbort)
 			hasAbort = 1;
 			break;
 		}
-#ifndef SQLITE_OMIT_FOREIGN_KEY
 		if (opcode == OP_FkCounter && pOp->p1 == 0 && pOp->p2 == 1) {
 			hasFkCounter = 1;
 		}
-#endif
 	}
 	sqlite3DbFree(v->db, sIter.apSub);
 
@@ -2245,7 +2243,6 @@ sqlite3VdbeCloseStatement(Vdbe * p, int eOp)
  * SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT_FOREIGNKEY
  * and write an error message to it. Then return SQLITE_ERROR.
  */
-#ifndef SQLITE_OMIT_FOREIGN_KEY
 int
 sqlite3VdbeCheckFk(Vdbe * p, int deferred)
 {
@@ -2259,7 +2256,6 @@ sqlite3VdbeCheckFk(Vdbe * p, int deferred)
 	}
 	return SQLITE_OK;
 }
-#endif
 
 int
 sql_txn_begin(Vdbe *p)