diff --git a/egison.cabal b/egison.cabal
--- a/egison.cabal
+++ b/egison.cabal
@@ -1,5 +1,5 @@
 Name:                egison
-Version:             3.2.17
+Version:             3.2.18
 Synopsis:            Programming language with non-linear pattern-matching against unfree data types
 Description:
   An interpreter for Egison, the programming langugage that realized non-linear pattern-matching against unfree data types.
diff --git a/hs-src/Interpreter/egisoni.hs b/hs-src/Interpreter/egisoni.hs
--- a/hs-src/Interpreter/egisoni.hs
+++ b/hs-src/Interpreter/egisoni.hs
@@ -36,25 +36,24 @@
           case opts of
             Options {optShowHelp = True} -> printHelp
             Options {optShowVersion = True} -> printVersionNumber
-            Options {optPrompt = prompt, optShowBanner = bannerFlag} -> do
+            Options {optPrompt = prompt, optShowBanner = bannerFlag, optNoIO = noIOFlag} -> do
+              env <-if noIOFlag then initialEnvNoIO else initialEnv
               case nonOpts of
                 [] -> do
-                  env <- initialEnv
                   when bannerFlag showBanner >> repl env prompt >> when bannerFlag showByebyeMessage
                 (file:args) -> do
                   case opts of
                     Options {optLoadOnly = True} -> do
-                      env <- initialEnvNoIO
                       result <- evalEgisonTopExprs env [LoadFile file]
                       either print (const $ return ()) result
                     Options {optLoadOnly = False} -> do
-                      env <- initialEnv
                       result <- evalEgisonTopExprs env [LoadFile file, Execute (ApplyExpr (VarExpr "main") (CollectionExpr (Sq.fromList (map (ElementExpr . StringExpr) args))))]
                       either print (const $ return ()) result
 
 data Options = Options {
     optShowVersion :: Bool,
     optShowHelp :: Bool,
+    optNoIO :: Bool,
     optShowBanner :: Bool,
     optLoadOnly :: Bool,
     optPrompt :: String
@@ -64,6 +63,7 @@
 defaultOptions = Options {
     optShowVersion = False,
     optShowHelp = False,
+    optNoIO = False,
     optShowBanner = True,
     optLoadOnly = False,
     optPrompt = "> "
@@ -77,6 +77,9 @@
   Option ['h', '?'] ["help"]
     (NoArg (\opts -> opts {optShowHelp = True}))
     "show usage information",
+  Option [] ["no-io"]
+    (NoArg (\opts -> opts {optNoIO = True}))
+    "show usage information",
   Option [] ["no-banner"]
     (NoArg (\opts -> opts {optShowBanner = False}))
     "show usage information",
@@ -96,6 +99,7 @@
   putStrLn "Options:"
   putStrLn "  --help                Display this information"
   putStrLn "  --version             Display egison version information"
+  putStrLn "  --no-io               No IO primitives"
   putStrLn "  --no-banner           Don't show banner"
   putStrLn "  --load                Don't execute main function"
   putStrLn "  --prompt string       Set prompt of the interpreter"
diff --git a/hs-src/Language/Egison/Primitives.hs b/hs-src/Language/Egison/Primitives.hs
--- a/hs-src/Language/Egison/Primitives.hs
+++ b/hs-src/Language/Egison/Primitives.hs
@@ -445,6 +445,7 @@
                , ("read-file", readFile')
                  
                , ("rand", randRange)
+               , ("sqlite", sqlite)
                ]
 
 makeIO :: EgisonM EgisonValue -> EgisonValue
@@ -543,7 +544,7 @@
   dbName <- fromEgison val
   qStr <- fromEgison val'
   ret <- liftIO $ query' (T.pack dbName) $ T.pack qStr
-  return $ Collection $ Sq.fromList $ map (\r -> Tuple (map toEgison r)) ret
+  return $ makeIO $ return $ Collection $ Sq.fromList $ map (\r -> Tuple (map toEgison r)) ret
  where
   query' :: T.Text -> T.Text -> IO [[String]]
   query' dbName q = do
diff --git a/lib/core/database.egi b/lib/core/database.egi
--- a/lib/core/database.egi
+++ b/lib/core/database.egi
@@ -37,4 +37,4 @@
 ;;
 ;; for SQLite
 ;;
-(define $pure-sqlite (lambda [$q] (io (sqlite q))))
+(define $pure-sqlite (lambda [$db $q] (io (sqlite db q))))
