Index: src/sqliteInt.h
===================================================================
--- src/sqliteInt.h	(revision 87306)
+++ src/sqliteInt.h	(working copy)
@@ -2522,6 +2522,16 @@
 #endif
 
 /*
+** The CoreServices.h and CoreFoundation.h headers are needed for excluding a
+** -journal file from Time Machine backups when its associated database has
+** previously been excluded by the client code.
+*/
+#if defined(__APPLE__)
+#include <CoreServices/CoreServices.h>
+#include <CoreFoundation/CoreFoundation.h>
+#endif
+
+/*
 ** The following macros mimic the standard library functions toupper(),
 ** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The
 ** sqlite versions only work for ASCII characters, regardless of locale.
Index: src/pager.c
===================================================================
--- src/pager.c	(revision 87306)
+++ src/pager.c	(working copy)
@@ -5130,7 +5130,21 @@
   }
 }
 
+#if defined(__APPLE__)
 /*
+** Create and return a CFURLRef given a cstring containing the path to a file.
+*/
+static CFURLRef create_cfurl_from_cstring(const char* filePath){
+  CFStringRef urlString = CFStringCreateWithFileSystemRepresentation(
+      kCFAllocatorDefault, filePath);
+  CFURLRef urlRef = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
+      urlString, kCFURLPOSIXPathStyle, FALSE);
+  CFRelease(urlString);
+  return urlRef;
+}
+#endif
+
+/*
 ** This function is called at the start of every write transaction.
 ** There must already be a RESERVED or EXCLUSIVE lock on the database 
 ** file when this routine is called.
@@ -5189,6 +5203,24 @@
   #else
         rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
   #endif
+#if defined(__APPLE__)
+        /* Set the TimeMachine exclusion metadata for the journal if it has
+        ** been set for the database. Only do this for unix-type vfs
+        ** implementations. */
+        if( rc==SQLITE_OK && pPager->zFilename!=NULL
+         && strlen(pPager->zFilename)>0
+         && memcmp(pVfs->zName, "unix", 4)==0
+         && ( pVfs->zName[4]=='-' || pVfs->zName[4]=='\0' ) ){
+          CFURLRef database = create_cfurl_from_cstring(pPager->zFilename);
+          if( CSBackupIsItemExcluded(database, NULL) ){
+            CFURLRef journal = create_cfurl_from_cstring(pPager->zJournal);
+            /* Ignore errors from the following exclusion call. */
+            CSBackupSetItemExcluded(journal, TRUE, FALSE);
+            CFRelease(journal);
+          }
+          CFRelease(database);
+        }
+#endif
       }
       assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
     }
Index: ext/fts3/fts3_porter.c
===================================================================
--- ext/fts3/fts3_porter.c	(revision 87306)
+++ ext/fts3/fts3_porter.c	(working copy)
@@ -129,7 +129,7 @@
 /*
 ** Vowel or consonant
 */
-static const char cType[] = {
+static const char vOrCType[] = {
    0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
    1, 1, 1, 2, 1
 };
@@ -153,7 +153,7 @@
   char x = *z;
   if( x==0 ) return 0;
   assert( x>='a' && x<='z' );
-  j = cType[x-'a'];
+  j = vOrCType[x-'a'];
   if( j<2 ) return j;
   return z[1]==0 || isVowel(z + 1);
 }
@@ -162,7 +162,7 @@
   char x = *z;
   if( x==0 ) return 0;
   assert( x>='a' && x<='z' );
-  j = cType[x-'a'];
+  j = vOrCType[x-'a'];
   if( j<2 ) return 1-j;
   return isConsonant(z + 1);
 }
