--- /dev/null
+From 270b1951d67634aa9f71ef4f859e2225bb20afae Mon Sep 17 00:00:00 2001
+From: Jeroen van der Heijden <jeroen@transceptor.technology>
+Date: Thu, 10 Sep 2020 15:37:15 +0200
+Subject: [PATCH] Fixes 32 bit compile issue, #135
+
+---
+ include/llist/llist.h | 2 +
+ include/siri/db/query.h | 8 ++++
+ include/siri/grammar/gramp.h | 5 +++
+ include/siri/inc.h | 14 +++++++
+ include/siri/version.h | 4 +-
+ src/llist/llist.c | 19 ++++++++++
+ src/siri/db/query.c | 71 ++++++++++++++++++++++++++++++++++--
+ 7 files changed, 118 insertions(+), 5 deletions(-)
+ create mode 100644 include/siri/inc.h
+
+diff --git a/include/llist/llist.h b/include/llist/llist.h
+index e5c57250..b49bc6fe 100644
+--- a/include/llist/llist.h
++++ b/include/llist/llist.h
+@@ -11,9 +11,11 @@ typedef struct llist_node_s llist_node_t;
+ #include <vec/vec.h>
+
+ typedef int (*llist_cb)(void * data, void * args);
++typedef void (*llist_destroy_cb)(void * data);
+
+ llist_t * llist_new(void);
+ void llist_free_cb(llist_t * llist, llist_cb cb, void * args);
++void llist_destroy(llist_t * llist, llist_destroy_cb cb);
+ int llist_append(llist_t * llist, void * data);
+ int llist_walk(llist_t * llist, llist_cb cb, void * args);
+ void llist_walkn(llist_t * llist, size_t * n, llist_cb cb, void * args);
+diff --git a/include/siri/db/query.h b/include/siri/db/query.h
+index fbe2ef76..b7f8971f 100644
+--- a/include/siri/db/query.h
++++ b/include/siri/db/query.h
+@@ -44,6 +44,11 @@ typedef struct siridb_query_s siridb_query_t;
+ #include <siri/db/series.h>
+ #include <siri/db/db.h>
+ #include <siri/net/protocol.h>
++#include <siri/inc.h>
++
++#if SIRIDB_EXPR_ALLOC
++#include <llist/llist.h>
++#endif
+
+ void siridb_query_run(
+ uint16_t pid,
+@@ -83,6 +88,9 @@ struct siridb_query_s
+ cleri_parse_t * pr;
+ siridb_nodes_t * nodes;
+ struct timespec start;
++#if SIRIDB_EXPR_ALLOC
++ llist_t * expr_cache;
++#endif
+ };
+
+ #endif /* SIRIDB_QUERY_H_ */
+diff --git a/include/siri/grammar/gramp.h b/include/siri/grammar/gramp.h
+index 1c1826f9..f2796951 100644
+--- a/include/siri/grammar/gramp.h
++++ b/include/siri/grammar/gramp.h
+@@ -26,9 +26,14 @@
+
+
+ #if CLERI_VERSION_MINOR >= 12
++#if SIRIDB_IS64BIT
+ #define CLERI_NODE_DATA(__node) ((int64_t)(__node)->data)
+ #define CLERI_NODE_DATA_ADDR(__node) ((int64_t *) &(__node)->data)
+ #else
++#define CLERI_NODE_DATA(__node) *((int64_t *)(__node)->data)
++#define CLERI_NODE_DATA_ADDR(__node) ((int64_t *)(__node)->data)
++#endif
++#else
+ #define CLERI_NODE_DATA(__node) (__node)->result
+ #define CLERI_NODE_DATA_ADDR(__node) &(__node)->result
+ #endif
+diff --git a/include/siri/inc.h b/include/siri/inc.h
+new file mode 100644
+index 00000000..c55c7c12
+--- /dev/null
++++ b/include/siri/inc.h
+@@ -0,0 +1,14 @@
++#if UINTPTR_MAX == 0xffffffff
++#define SIRIDB_IS64BIT 0
++#elif UINTPTR_MAX == 0xffffffffffffffff
++#define SIRIDB_IS64BIT 1
++#else
++#define SIRIDB_IS64BIT __WORDSIZE == 64
++#endif
++
++
++#if SIRIDB_IS64BIT
++#define SIRIDB_EXPR_ALLOC 0
++#else
++#define SIRIDB_EXPR_ALLOC CLERI_VERSION_MINOR >= 12
++#endif
+diff --git a/include/siri/version.h b/include/siri/version.h
+index ac332a39..26b90996 100644
+--- a/include/siri/version.h
++++ b/include/siri/version.h
+@@ -6,7 +6,7 @@
+
+ #define SIRIDB_VERSION_MAJOR 2
+ #define SIRIDB_VERSION_MINOR 0
+-#define SIRIDB_VERSION_PATCH 38
++#define SIRIDB_VERSION_PATCH 39
+
+ /*
+ * Use SIRIDB_VERSION_PRE_RELEASE for alpha release versions.
+@@ -15,7 +15,7 @@
+ * Note that debian alpha packages should use versions like this:
+ * 2.0.34-0alpha0
+ */
+-#define SIRIDB_VERSION_PRE_RELEASE ""
++#define SIRIDB_VERSION_PRE_RELEASE "-alpha-0"
+
+ #ifndef NDEBUG
+ #define SIRIDB_VERSION_BUILD_RELEASE "+debug"
+diff --git a/src/llist/llist.c b/src/llist/llist.c
+index 893ed363..adb8aa91 100644
+--- a/src/llist/llist.c
++++ b/src/llist/llist.c
+@@ -42,6 +42,25 @@ void llist_free_cb(llist_t * llist, llist_cb cb, void * args)
+ free(llist);
+ }
+
++/*
++ * Destroys the linked list and calls a call-back function on each item.
++ * The result of the call back function will be ignored.
++ */
++void llist_destroy(llist_t * llist, llist_destroy_cb cb)
++{
++ llist_node_t * node = llist->first;
++ llist_node_t * next;
++
++ while (node != NULL)
++ {
++ cb(node->data);
++ next = node->next;
++ free(node);
++ node = next;
++ }
++ free(llist);
++}
++
+ /*
+ * Appends to the end of the list.
+ *
+diff --git a/src/siri/db/query.c b/src/siri/db/query.c
+index ae744d09..941614a7 100644
+--- a/src/siri/db/query.c
++++ b/src/siri/db/query.c
+@@ -25,6 +25,11 @@
+ #include <sys/time.h>
+ #include <siri/err.h>
+
++#if SIRIDB_EXPR_ALLOC
++#include <llist/llist.h>
++#endif
++
++
+ #define QUERY_TOO_LONG -1
+ #define QUERY_MAX_LENGTH 8192
+ #define QUERY_EXTRA_ALLOC_SIZE 200
+@@ -32,7 +37,12 @@
+
+ static void QUERY_send_invalid_error(uv_async_t * handle);
+ static void QUERY_parse(uv_async_t * handle);
+-static int QUERY_walk(cleri_node_t * node, siridb_walker_t * walker);
++static int QUERY_walk(
++#if SIRIDB_EXPR_ALLOC
++ siridb_query_t * query,
++#endif
++ cleri_node_t * node,
++ siridb_walker_t * walker);
+ static int QUERY_to_packer(qp_packer_t * packer, siridb_query_t * query);
+ static int QUERY_time_expr(
+ cleri_node_t * node,
+@@ -82,6 +92,17 @@ void siridb_query_run(
+ return;
+ }
+
++ #if SIRIDB_EXPR_ALLOC
++ if ((query->expr_cache = llist_new()) == NULL)
++ {
++ ERR_ALLOC
++ free(query->q);
++ free(query);
++ free(handle);
++ return;
++ }
++ #endif
++
+ /*
+ * Set start time.
+ * (must be real time since we translate now with this value)
+@@ -160,6 +181,13 @@ void siridb_query_free(uv_handle_t * handle)
+ cleri_parse_free(query->pr);
+ }
+
++ #if SIRIDB_EXPR_ALLOC
++ if (query->expr_cache != NULL)
++ {
++ llist_destroy(query->expr_cache, (llist_destroy_cb) free);
++ }
++ #endif
++
+ /* decrement client reference counter */
+ sirinet_stream_decref(query->client);
+
+@@ -589,6 +617,9 @@ static void QUERY_parse(uv_async_t * handle)
+ }
+
+ if ((rc = QUERY_walk(
++#if SIRIDB_EXPR_ALLOC
++ query,
++#endif
+ query->pr->tree->children->node,
+ walker)))
+ {
+@@ -678,7 +709,12 @@ static int QUERY_to_packer(qp_packer_t * packer, siridb_query_t * query)
+ return 0;
+ }
+
+-static int QUERY_walk(cleri_node_t * node, siridb_walker_t * walker)
++static int QUERY_walk(
++#if SIRIDB_EXPR_ALLOC
++ siridb_query_t * query,
++#endif
++ cleri_node_t * node,
++ siridb_walker_t * walker)
+ {
+ int rc;
+ uint32_t gid;
+@@ -723,6 +759,18 @@ static int QUERY_walk(cleri_node_t * node, siridb_walker_t * walker)
+ /* terminate buffer */
+ buffer[EXPR_MAX_SIZE - size] = 0;
+
++ #if SIRIDB_EXPR_ALLOC
++ {
++ int64_t * itmp = malloc(sizeof(int64_t));
++ if (itmp == NULL || llist_append(query->expr_cache, itmp))
++ {
++ free(itmp);
++ return EXPR_MEM_ALLOC_ERR;
++ }
++ node->data = itmp;
++ }
++ #endif
++
+ /* evaluate the expression */
+ if ((rc = expr_parse(CLERI_NODE_DATA_ADDR(node), buffer)))
+ {
+@@ -751,6 +799,18 @@ static int QUERY_walk(cleri_node_t * node, siridb_walker_t * walker)
+ /* terminate buffer */
+ buffer[EXPR_MAX_SIZE - size] = 0;
+
++ #if SIRIDB_EXPR_ALLOC
++ {
++ int64_t * itmp = malloc(sizeof(int64_t));
++ if (itmp == NULL || llist_append(query->expr_cache, itmp))
++ {
++ free(itmp);
++ return EXPR_MEM_ALLOC_ERR;
++ }
++ node->data = itmp;
++ }
++ #endif
++
+ /* evaluate the expression */
+ if ((rc = expr_parse(CLERI_NODE_DATA_ADDR(node), buffer)))
+ {
+@@ -770,7 +830,12 @@ static int QUERY_walk(cleri_node_t * node, siridb_walker_t * walker)
+ {
+ current = current->node->children;
+ }
+- if ((rc = QUERY_walk(current->node, walker)))
++ if ((rc = QUERY_walk(
++#if SIRIDB_EXPR_ALLOC
++ query,
++#endif
++ current->node,
++ walker)))
+ {
+ return rc;
+ }
+--
+2.28.0
+