SQLite Forum

lsm1 compression
Login
Cannot reproduce here.

I copied your lz4 files into the ext/lsm1 directory of SQLite, applied the patch below to build the shell tool with lsm and lz4 support built-in, then ran the following multiple times:

<verbatim>
  CREATE VIRTUAL TABLE cdx USING lsm1 ('/home/dan/work/sqlite/bld4/lz4_weetest.lsm', key, TEXT, cdxline);
  insert into cdx (key, cdxline) values ('ai,ak)/20200621000621','ai,ak)/ 20200621000621 http://ak.ai/ text/html 200 7OJCBOXLSJRUTLFALBSMSD5XHAWSMGO3 - - 5907 12823972 ARCHIVEIT-9810-DAILY-JOB1205229-SEED2290404-20200620230127543-00000-h3.warc.gz');
  insert into cdx (key, cdxline) values ('ai,ak)/20200621000621','ai,ak)/ 20200621000621 http://ak.ai/ text/html 200 7OJCBOXLSJRUTLFALBSMSD5XHAWSMGO3 - - 5907 12823972 ARCHIVEIT-9810-DAILY-JOB1205229-SEED2290404-20200620230127543-00000-h3.warc.gz');
  insert into cdx (key, cdxline) values ('ai,ak)/20200621000622','ai,ak)/ 20200621000621 http://ak.ai/ text/html 200 7OJCBOXLSJRUTLFALBSMSD5XHAWSMGO3 - - 5907 12823972 ARCHIVEIT-9810-DAILY-JOB1205229-SEED2290404-20200620230127543-00000-h3.warc.gz');
  insert into cdx (key, cdxline) values ('ai,ak)/20200621000623','ai,ak)/ 20200621000621 http://ak.ai/ text/html 200 7OJCBOXLSJRUTLFALBSMSD5XHAWSMGO3 - - 5907 12823972 ARCHIVEIT-9810-DAILY-JOB1205229-SEED2290404-20200620230127543-00000-h3.warc.gz');
  insert into cdx (key, cdxline) values ('ai,ak)/20200621000625','ai,ak)/ 20200621000621 http://ak.ai/ text/html 200 7OJCBOXLSJRUTLFALBSMSD5XHAWSMGO3 - - 5907 12823972 ARCHIVEIT-9810-DAILY-JOB1205229-SEED2290404-20200620230127543-00000-h3.warc.gz');
  insert into cdx (key, cdxline) values ('ai,ak)/20200621000639','ai,ak)/ 20200621000621 http://ak.ai/ text/html 200 7OJCBOXLSJRUTLFALBSMSD5XHAWSMGO3 - - 5907 12823972 ARCHIVEIT-9810-DAILY-JOB1205229-SEED2290404-20200620230127543-00000-h3.warc.gz');
</verbatim>

but, no error. Not under valgrind or with asan either. Any ideas?

<verbatim>
Index: ext/lsm1/Makefile
==================================================================
--- ext/lsm1/Makefile
+++ ext/lsm1/Makefile
@@ -11,10 +11,11 @@
 
 LSMOBJ    = \
   lsm_ckpt.o \
   lsm_file.o \
   lsm_log.o \
+  lsm-lz4.o \
   lsm_main.o \
   lsm_mem.o \
   lsm_mutex.o \
   lsm_shared.o \
   lsm_sorted.o \
@@ -21,15 +22,20 @@
   lsm_str.o \
   lsm_tree.o \
   lsm_unix.o \
   lsm_win32.o \
   lsm_varint.o \
-  lsm_vtab.o
+  lsm_vtab.o \
+  lz4.o
 
 LSMHDR   = \
   $(LSMDIR)/lsm.h \
-  $(LSMDIR)/lsmInt.h
+  $(LSMDIR)/lsmInt.h \
+  $(LSMDIR)/lsm-lz4.h \
+  $(LSMDIR)/lz4.h \
+  $(LSMDIR)/lz4_decoder.h \
+  $(LSMDIR)/lz4_encoder.h
 
 LSMTESTSRC = $(LSMDIR)/lsm-test/lsmtest1.c $(LSMDIR)/lsm-test/lsmtest2.c     \
              $(LSMDIR)/lsm-test/lsmtest3.c $(LSMDIR)/lsm-test/lsmtest4.c     \
              $(LSMDIR)/lsm-test/lsmtest5.c $(LSMDIR)/lsm-test/lsmtest6.c     \
              $(LSMDIR)/lsm-test/lsmtest7.c $(LSMDIR)/lsm-test/lsmtest8.c     \
@@ -41,16 +47,17 @@
              $(LSMDIR)/lsm-test/lsmtest_util.c $(LSMDIR)/lsm-test/lsmtest_win32.c
 
 
 # all: lsm.so
 
-LSMOPTS += -fPIC -DLSM_MUTEX_PTHREADS=1 -I$(LSMDIR) -DHAVE_ZLIB
+LSMOPTS += -fPIC -DLSM_MUTEX_PTHREADS=1 -I$(LSMDIR) -DHAVE_ZLIB -DSQLITE_CORE
+LZ4_OPTS = -DUSE_LSM_LZ4_COMPRESSOR 
 
 lsm.so:	$(LSMOBJ)
 	$(TCCX) -shared -fPIC -o lsm.so $(LSMOBJ)
 
 %.o:	$(LSMDIR)/%.c $(LSMHDR) sqlite3.h
-	$(TCCX) $(LSMOPTS) -c $<
+	$(TCCX) $(LSMOPTS) $(LZ4_OPTS) -c $<
 	
 lsmtest$(EXE): $(LSMOBJ) $(LSMTESTSRC) $(LSMTESTHDR) sqlite3.o
 	# $(TCPPX) -c $(TOP)/lsm-test/lsmtest_tdb2.cc
-	$(TCCX) $(LSMOPTS) $(LSMTESTSRC) $(LSMOBJ) sqlite3.o -o lsmtest$(EXE) $(THREADLIB) -lz
+	$(TCCX) $(LSMOPTS) $(LZ4_OPTS) $(LSMTESTSRC) $(LSMOBJ) sqlite3.o -o lsmtest$(EXE) $(THREADLIB) -lz

Index: ext/lsm1/lsm_vtab.c
==================================================================
--- ext/lsm1/lsm_vtab.c
+++ ext/lsm1/lsm_vtab.c
@@ -90,10 +90,11 @@
 #include "sqlite3ext.h"
 SQLITE_EXTENSION_INIT1
 #include "lsm.h"
 #include <assert.h>
 #include <string.h>
+#include "lsm-lz4.h"
 
 /* Forward declaration of subclasses of virtual table objects */
 typedef struct lsm1_vtab lsm1_vtab;
 typedef struct lsm1_cursor lsm1_cursor;
 typedef struct lsm1_vblob lsm1_vblob;
@@ -263,10 +264,16 @@
   rc = lsm_new(0, &pNew->pDb);
   if( rc ){
     *pzErr = sqlite3_mprintf("lsm_new failed with error code %d",  rc);
     rc = SQLITE_ERROR;
     goto connect_failed;
+  }
+  rc = lsm_lz4_config(pNew->pDb);
+  if( rc ){
+    *pzErr = sqlite3_mprintf("lsm_lz4_config failed with error code %d",  rc);
+    rc = SQLITE_ERROR;
+    goto connect_failed;
   }
   zFilename = sqlite3_mprintf("%s", argv[3]);
   lsm1Dequote(zFilename);
   rc = lsm_open(pNew->pDb, zFilename);
   sqlite3_free(zFilename);

Index: main.mk
==================================================================
--- main.mk
+++ main.mk
@@ -48,10 +48,13 @@
 TCCX += -I$(TOP)/ext/async -I$(TOP)/ext/userauth
 TCCX += -I$(TOP)/ext/session
 TCCX += -I$(TOP)/ext/fts5
 THREADLIB += $(LIBS)
 
+LSMDIR=$(TOP)/ext/lsm1/
+include $(LSMDIR)/Makefile
+
 # Object files for the SQLite library.
 #
 LIBOBJ+= vdbe.o parse.o \
          alter.o analyze.o attach.o auth.o \
          backup.o bitvec.o btmutex.o btree.o build.o \
@@ -74,11 +77,11 @@
          table.o threads.o tokenize.o treeview.o trigger.o \
          update.o upsert.o userauth.o util.o vacuum.o \
          vdbeapi.o vdbeaux.o vdbeblob.o vdbemem.o vdbesort.o \
 	 vdbetrace.o vdbevtab.o \
          wal.o walker.o where.o wherecode.o whereexpr.o \
-         utf.o vtab.o window.o
+         utf.o vtab.o window.o $(LSMOBJ)
 
 LIBOBJ += sqlite3session.o
 
 # All of the source code files.
 #
@@ -549,11 +552,11 @@
 # This is the default Makefile target.  The objects listed here
 # are what get build when you type just "make" with no arguments.
 #
 all:	sqlite3.h libsqlite3.a sqlite3$(EXE)
 
-libsqlite3.a:	$(LIBOBJ)
+libsqlite3.a: $(LIBOBJ) 
 	$(AR) libsqlite3.a $(LIBOBJ)
 	$(RANLIB) libsqlite3.a
 
 sqlite3$(EXE):	shell.c libsqlite3.a sqlite3.h
 	$(TCCX) $(READLINE_FLAGS) -o sqlite3$(EXE) $(SHELL_OPT) \

Index: src/main.c
==================================================================
--- src/main.c
+++ src/main.c
@@ -3350,10 +3350,12 @@
 
   /* Load automatic extensions - extensions that have been registered
   ** using the sqlite3_automatic_extension() API.
   */
   if( rc==SQLITE_OK ){
+    int sqlite3_lsm_init(sqlite3 *, char **, const sqlite3_api_routines *);
+    sqlite3_lsm_init(db, 0, 0);
     sqlite3AutoLoadExtensions(db);
     rc = sqlite3_errcode(db);
     if( rc!=SQLITE_OK ){
       goto opendb_out;
     }
</verbatim>