Skip to content

Commit a9733db

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 a9733db

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-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: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -667,16 +667,25 @@ 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/ && SQLite3::SQLITE_PACKAGED_LIBRARIES
672+
skip("as of sqlite 3.48.0, the autoconf amalgamation does not reliably find dlopen" \
673+
"on windows when building sqlite from source")
674+
end
675+
assert_respond_to(db, :load_extension)
676+
assert_respond_to(db, :enable_load_extension)
677+
end
678+
670679
def test_load_extension_error_with_nonexistent_path
671-
skip("extensions are not enabled") unless db.respond_to?(:load_extension)
680+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
672681
db.enable_load_extension(true)
673682

674683
assert_raises(SQLite3::Exception) { db.load_extension("/nonexistent/path") }
675684
assert_raises(SQLite3::Exception) { db.load_extension(Pathname.new("nonexistent")) }
676685
end
677686

678687
def test_load_extension_error_with_invalid_argument
679-
skip("extensions are not enabled") unless db.respond_to?(:load_extension)
688+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
680689
db.enable_load_extension(true)
681690

682691
assert_raises(TypeError) { db.load_extension(1) }
@@ -686,6 +695,8 @@ def test_load_extension_error_with_invalid_argument
686695
end
687696

688697
def test_load_extension_with_an_extension_descriptor
698+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
699+
689700
mock_database_load_extension_internal(db)
690701

691702
db.load_extension(Pathname.new("/path/to/ext2"))
@@ -698,7 +709,10 @@ def test_load_extension_with_an_extension_descriptor
698709
end
699710

700711
def test_initialize_extensions_with_extensions_calls_enable_load_extension
712+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
713+
701714
mock_database_load_extension_internal(db)
715+
702716
class << db
703717
attr_accessor :enable_load_extension_called
704718
attr_reader :enable_load_extension_arg
@@ -734,6 +748,8 @@ def enable_load_extension(val)
734748
end
735749

736750
def test_initialize_extensions_object_is_an_extension_specifier
751+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
752+
737753
mock_database_load_extension_internal(db)
738754

739755
db.initialize_extensions([Pathname.new("/path/to/extension")])
@@ -746,6 +762,8 @@ def test_initialize_extensions_object_is_an_extension_specifier
746762
end
747763

748764
def test_initialize_extensions_object_not_an_extension_specifier
765+
skip("extensions are not enabled") unless db.respond_to?(:enable_load_extension)
766+
749767
mock_database_load_extension_internal(db)
750768

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

0 commit comments

Comments
 (0)