Skip to content

Commit 479228a

Browse files
committed
Database#enable_load_extension def only if extensions are available
On some platforms where dlopen can't be found at build time, HAVE_SQLITE3_LOAD_EXTENSION is false by HAVE_SQLITE3_ENABLE_LOAD_EXTENSION could still be true. Only define `enable_load_extension` if both are true.
1 parent 4744340 commit 479228a

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

ext/sqlite3/database.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ load_extension_internal(VALUE self, VALUE file)
789789
}
790790
#endif
791791

792-
#ifdef HAVE_SQLITE3_ENABLE_LOAD_EXTENSION
792+
#if defined(HAVE_SQLITE3_ENABLE_LOAD_EXTENSION) && defined(HAVE_SQLITE3_LOAD_EXTENSION)
793793
/* call-seq: db.enable_load_extension(onoff)
794794
*
795795
* Enable or disable extension loading.
@@ -992,11 +992,11 @@ init_sqlite3_database(void)
992992

993993
#ifdef HAVE_SQLITE3_LOAD_EXTENSION
994994
rb_define_private_method(cSqlite3Database, "load_extension_internal", load_extension_internal, 1);
995-
#endif
996-
997995
#ifdef HAVE_SQLITE3_ENABLE_LOAD_EXTENSION
998996
rb_define_method(cSqlite3Database, "enable_load_extension", enable_load_extension, 1);
999997
#endif
998+
#endif
999+
10001000

10011001
rb_sqlite3_aggregator_init();
10021002
}

test/test_database.rb

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -667,16 +667,27 @@ def test_strict_mode
667667
assert_match(/no such column: "?nope"?/, error.message)
668668
end
669669

670+
def test_load_extension_is_defined_on_expected_platforms
671+
if ::RUBY_PLATFORM =~ /mingw|mswin/ &&
672+
SQLite3::SQLITE_PACKAGED_LIBRARIES &&
673+
!SQLite3::SQLITE_PRECOMPILED_LIBRARIES
674+
skip("as of sqlite 3.48.0, the autoconf amalgamation does not reliably find dlopen" \
675+
"on windows when building sqlite from source")
676+
end
677+
assert_respond_to(db, :load_extension)
678+
assert_respond_to(db, :enable_load_extension)
679+
end
680+
670681
def test_load_extension_error_with_nonexistent_path
671-
skip("extensions are not enabled") unless db.respond_to?(:load_extension)
682+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
672683
db.enable_load_extension(true)
673684

674685
assert_raises(SQLite3::Exception) { db.load_extension("/nonexistent/path") }
675686
assert_raises(SQLite3::Exception) { db.load_extension(Pathname.new("nonexistent")) }
676687
end
677688

678689
def test_load_extension_error_with_invalid_argument
679-
skip("extensions are not enabled") unless db.respond_to?(:load_extension)
690+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
680691
db.enable_load_extension(true)
681692

682693
assert_raises(TypeError) { db.load_extension(1) }
@@ -686,6 +697,8 @@ def test_load_extension_error_with_invalid_argument
686697
end
687698

688699
def test_load_extension_with_an_extension_descriptor
700+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
701+
689702
mock_database_load_extension_internal(db)
690703

691704
db.load_extension(Pathname.new("/path/to/ext2"))
@@ -698,7 +711,10 @@ def test_load_extension_with_an_extension_descriptor
698711
end
699712

700713
def test_initialize_extensions_with_extensions_calls_enable_load_extension
714+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
715+
701716
mock_database_load_extension_internal(db)
717+
702718
class << db
703719
attr_accessor :enable_load_extension_called
704720
attr_reader :enable_load_extension_arg
@@ -734,6 +750,8 @@ def enable_load_extension(val)
734750
end
735751

736752
def test_initialize_extensions_object_is_an_extension_specifier
753+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
754+
737755
mock_database_load_extension_internal(db)
738756

739757
db.initialize_extensions([Pathname.new("/path/to/extension")])
@@ -746,6 +764,8 @@ def test_initialize_extensions_object_is_an_extension_specifier
746764
end
747765

748766
def test_initialize_extensions_object_not_an_extension_specifier
767+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
768+
749769
mock_database_load_extension_internal(db)
750770

751771
db.initialize_extensions(["/path/to/extension"])

0 commit comments

Comments
 (0)