diff --git a/tools/java_api/src/test/java/com/kuzudb/test/ExtensionTest.java b/tools/java_api/src/test/java/com/kuzudb/test/ExtensionTest.java new file mode 100644 index 0000000000..bab76e9c93 --- /dev/null +++ b/tools/java_api/src/test/java/com/kuzudb/test/ExtensionTest.java @@ -0,0 +1,19 @@ +package com.kuzudb.java_test; + +import com.kuzudb.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class ExtensionTest extends TestBase { + @Test + void HttpfsInstallAndLoad() throws KuzuObjectRefDestroyedException { + KuzuQueryResult result = conn.query("INSTALL httpfs"); + assertTrue(result.isSuccess()); + result.destroy(); + // Skip loading the extension for now until the fix is in place + // result = conn.query("LOAD EXTENSION httpfs"); + // assertTrue(result.isSuccess()); + // result.destroy(); + } +} diff --git a/tools/nodejs_api/test/test.js b/tools/nodejs_api/test/test.js index cf543417fe..d90281ae18 100644 --- a/tools/nodejs_api/test/test.js +++ b/tools/nodejs_api/test/test.js @@ -14,6 +14,7 @@ describe("kuzu", () => { importTest("Connection", "./test_connection.js"); importTest("Query result", "./test_query_result.js"); importTest("Data types", "./test_data_type.js"); + importTest("Extension loading", "./test_extension.js"); importTest("Query parameters", "./test_parameter.js"); importTest("Concurrent query execution", "./test_concurrency.js"); }); diff --git a/tools/nodejs_api/test/test_extension.js b/tools/nodejs_api/test/test_extension.js new file mode 100644 index 0000000000..6929b73d0e --- /dev/null +++ b/tools/nodejs_api/test/test_extension.js @@ -0,0 +1,9 @@ +const { assert } = require("chai"); + +describe("Extension loading", () => { + it("should install and load httpfs extension", async function () { + await conn.query("INSTALL httpfs"); + // Skip this test until the fix is in place + // await conn.query("LOAD EXTENSION httpfs"); + }); +}); diff --git a/tools/python_api/src_py/__init__.py b/tools/python_api/src_py/__init__.py index 3597013970..b478c830d5 100644 --- a/tools/python_api/src_py/__init__.py +++ b/tools/python_api/src_py/__init__.py @@ -37,7 +37,20 @@ """ +import sys +import os + +# Set RTLD_GLOBAL and RTLD_NOW flags on Linux to fix the issue with loading +# extensions +if sys.platform == "linux": + original_dlopen_flags = sys.getdlopenflags() + sys.setdlopenflags(os.RTLD_GLOBAL | os.RTLD_NOW) + from .database import * from .connection import * from .query_result import * from .types import * + +# Restore the original dlopen flags +if sys.platform == "linux": + sys.setdlopenflags(original_dlopen_flags) diff --git a/tools/python_api/test/test_extension.py b/tools/python_api/test/test_extension.py new file mode 100644 index 0000000000..162ebb6142 --- /dev/null +++ b/tools/python_api/test/test_extension.py @@ -0,0 +1,4 @@ +def test_install_and_load_httpfs(establish_connection): + conn, db = establish_connection + conn.execute("INSTALL httpfs") + conn.execute("LOAD EXTENSION httpfs")