SQLite 3.54.0, 9 Ekim 2026'da yayımlandı; bir hafta sonra, 16 Ekim 2026'da 3.54.1 yaması geldi. Bu sürümde öne çıkanlar şunlardır: sqlite3 komut satırının durum bilgisi gösterebilen yeni istemi, sqlite3_analyzer aracının yerini alan .diskused komutu ve diskused() fonksiyonu, format() içinde JSON metni üreten %J ve %j dönüşümleri, end of ve negatif weekday tarih değiştiricileri ve ROWID adlı sütunları reddeden ALTER TABLE.
Bu yazıda 3.54.0 ve 3.54.1 sürüm notlarını konu başlıklarına ayırıp açıklıyor, sonunda bir önceki büyük sürüm olan 3.51.0'ı kısaca özetliyoruz. Yeni özellikleri gerektiren örnekler elimizdeki 3.50.6 sürümünde çalışmadığı için belgelere dayanılarak yazıldı ve işaretlendi; aynı ifadelerin eski sürümdeki davranışını ise gerçekten çalıştırarak gösterdik. Arada kalan 3.53 serisinin değişiklikleri SQLite 3.53 yenilikleri yazısında.
3.54.1: 32 bit derlemeler için önemli yama
3.54.1 sürüm notlarının ilk maddesi, 32 bit derlemelerde olası bir yığın (heap) arabellek taşmasının düzeltilmesidir; 64 bit derlemeler bu sorundan etkilenmez. Haber sayfası da sorunun bazı 32 bit derlemelerde ortaya çıktığını belirtir. Yamada ayrıca kullanıcıların bildirdiği diğer sorunlar düzeltildi. 3.54 serisine geçecekseniz doğrudan 3.54.1 veya sonrasını kullanın; özellikle 32 bit gömülü sistemlerde ve eski donanımlarda bu fark önemlidir.
Yeni komut satırı istemi ve kaçış dizileri

3.54.0 ile komut satırı istemi, açık dosyanın adını, işlem durumunu ve sürümü gösterebilen kaçış dizileri kazandı. Varsayılan istem de bu dizileri kullanacak biçimde değişti: solda yeşil renkte uygulama adı ve ana-alt sürüm numarası, ardından dosya adının son kısmı (bellek içi veritabanında italik "memory") gelir. Dosya adı normalde camgöbeği renktedir, bir işlem açıkken sarıya döner. Devam istemi ise ifadeyi tamamlamak için gereken en kısa karakter dizisini, örneğin eksik noktalı virgülü gösterir. Komut satırı belgelerindeki örneklerde gördüğünüz SQLite-3.54 ex1.db-> biçimindeki istem budur.
Bu ayrıntı küçük görünse de pratik bir yararı vardır: istemin renginden açık bir işlem bıraktığınızı fark edebilirsiniz. Unutulmuş bir BEGIN, başka süreçlerin yazmasını engelleyerek database is locked hatasına yol açabilir.
Kaçış karakteri ters eğik çizgi değil, düz eğik çizgidir (/). Belge bu seçimin, kabuk ve derleyici seçeneklerindeki kaçış dizileriyle çakışmayı azaltmak için yapıldığını açıklar. Tanınan diziler şunlardır:
| Dizi | Anlamı |
|---|---|
| // | Tek bir eğik çizgi |
| /NNN | Sekizlik değeri NNN olan bayt (ör. /40 boşluk) |
| /e | ESC karakteri, ANSI renk kodları için |
| /m ... /; | Yalnızca bellek içi veritabanında gösterilen metin |
| /r ... /; | Yalnızca salt okunur veritabanında gösterilen metin |
| /x ... /; | Yalnızca işlem açıkken gösterilen metin |
| /: | Önceki koşulun tersi (else) |
| /f, /F, /~ | Dosya adı: yalnızca son kısım, tam yol, ev dizini ~ ile kısaltılmış tam yol |
| /C | Devam isteminde ifadeyi kapatmak için gereken karakterler |
| /B | Devam istemini ana istemle aynı uzunluğa getiren boşluklar |
| /A | Uygulama adı (SQLite) |
| /v, /V | Sürüm: ana-alt (3.54) veya yama düzeyiyle (3.54.0) |
| /h, /H | Makine adı: ilk noktaya kadar veya tamamı |
| /u | Kullanıcı adı (ortam değişkeninden, güvenlik için güvenilmez) |
Tanınmayan her eğik çizgi kullanımı istemde bir hata metnine dönüşür; belge bunun, ileride yeni diziler eklenebilmesi için bilinçli bir kısıt olduğunu söyler. İstemler üç yoldan ayarlanır: çalışma anında .prompt komutuyla, açılışta SQLITE_PS1 ve SQLITE_PS2 ortam değişkenleriyle, derleme sırasında aynı adlı önişlemci değişkenleriyle. Renkler NO_COLOR ortam değişkeni, -DSQLITE_NO_COLOR derleme seçeneği veya .prompt --no-color ile kapatılabilir. Aşağıdaki örnekler belgedekilerden alınmıştır:
# SQLite 3.54.0 veya sonrası: istemleri ortam değişkenleriyle ayarlamak
# Renksiz istem; işlem açıkken dosya adının yanına * eklenir
export SQLITE_PS1='SQLite/40/f/x*/;>/40'
export SQLITE_PS2='/B/C>/40'
# 3.54 öncesindeki klasik istemi geri istemek
export SQLITE_PS1='sqlite>/40'
export SQLITE_PS2=' ...>/40'
# Renkleri kapatmak
export NO_COLOR=1Belgede renksiz istemin nasıl göründüğü de gösteriliyor. İşlem açıkken dosya adının yanında yıldız belirir ve devam istemi yalnızca eksik noktalı virgülü ister:
SQLite t1.db> BEGIN;
SQLite t1.db*> INSERT INTO t1 VALUES(5);
SQLite t1.db*> COMMIT;
SQLite t1.db> .open
SQLite memory> SELECT 1+(2*3) AS c1
;> ;Çalışma anında istemi görmek, değiştirmek ve sıfırlamak için kullanılan komutlar şunlardır. --reset açılıştaki değere, --hard-reset derleme sırasındaki varsayılana döner; ikincisi ortam değişkenlerini yalnızca çalışan süreç için kaldırır, kalıcı ortamınıza dokunmaz. Komut satırı editörü kitaplıklarının gerektirdiği görünmez metin işaretlerini araç kendisi eklediği için bunları istem metnine yazmamalısınız.
-- SQLite 3.54.0 veya sonrası komut satırı (çalıştırılmadı)
.prompt --show
.prompt "Ana istem->> " " devam... "
.prompt --reset
.prompt --hard-reset
.prompt --no-colorKomut satırındaki diğer değişiklikler
- Sütunlu çıktı biçimlerinde sorgu hiç satır döndürmese bile sütun başlıkları artık varsayılan olarak gösteriliyor. Bu,
.modekomutunun yeni--titles alwaysseçeneğinin varsayılan olmasıyla geldi; eski davranış--titles onile geri alınabilir. .modekomutuna satır sayısını yazdıran--rowcount on, tamsayı ve ondalık sayıların görünümünü printf tarzı bir biçim dizgesiyle denetleyen--ifmtve--fpfmtseçenekleri eklendi.-csvkomut satırı seçeneği, eski davranışla uyumluluk için gösterim sınırlarını otomatik olarak kapatıyor.- Unix sistemlerinde biçimlendirilmemiş BLOB çıktısında sıfır baytlar korunuyor.
- Bir SQL ifadesini yalnızca
GOveya/içeren bir satırla bitirme özelliği, araç özel bir derleme seçeneğiyle derlenmedikçe kaldırıldı. Komut satırı belgesinin bir bölümü bu özelliği hâlâ anlatıyor; sürüm notu daha günceldir. Betiklerinizde ifadeleri noktalı virgülle bitirin.
Çıktı biçimleri .mode çıktı biçimleri, CSV dışa aktarma CSV içe ve dışa aktarma yazısında ayrıntılı anlatılıyor.
.diskused ve diskused(): sqlite3_analyzer'ın yerine

Bir veritabanı dosyasında hangi tablonun ve indeksin ne kadar yer kapladığını görmek için yıllarca ayrı bir program olan sqlite3_analyzer kullanıldı. 3.54.0 ile aynı iş komut satırının yeni .diskused komutuna taşındı ve sqlite3_analyzer kullanımdan kaldırıldı. Haber sayfasına göre 3.54.0, bu programı içeren son sürümdür.
Komut, içeride SELECT diskused('main') çalıştırıp dönen metni olduğu gibi yazar. Çıktı aslında space_used adlı bir tablo için bir CREATE TABLE ifadesidir; insanların okuduğu açıklamalar bu ifadenin başındaki büyük bir yorumun içindedir. Çoğu kullanıcı yalnızca yorumu okur, ama çıktıyı başka bir dosyada SQL olarak çalıştırıp space_used tablosunu sorgulayarak daha ayrıntılı analiz yapabilirsiniz.
# SQLite 3.54.0 veya sonrası komut satırı (çalıştırılmadı)
sqlite3 demo.db .diskused
# Ham veriyi ayrı bir dosyada sorgulamak için çıktıyı SQL olarak çalıştırın
sqlite3 demo.db .diskused > alan.sql
sqlite3 analiz.db < alan.sqldiskused() fonksiyonu komut satırı aracına gömülüdür ama birleştirilmiş kaynak dosyası sqlite3.c içinde yoktur. Kendi uygulamanızda kullanmak istiyorsanız kaynak ağacındaki ext/misc/diskused.c dosyasını ayrıca derleyip eklenti olarak yüklemeniz gerekir. Fonksiyon DBSTAT sanal tablosu üzerine kuruludur, bu yüzden SQLite'ın -DSQLITE_ENABLE_DBSTAT_VTAB ile derlenmiş olması şarttır. Dosya boyutu ve boş sayfalarla ilgili bakım işleri için VACUUM ve auto_vacuum yazısına bakın.
ALTER TABLE artık ROWID adlı sütunları reddediyor
3.54.0 ile ALTER TABLE, ROWID, _ROWID_ veya OID adlı sütunları ekleme, silme ya da yeniden adlandırma girişimlerinde hata veriyor. Bu adlar her rowid tablosunda gizli tamsayı anahtarın takma adlarıdır. Eski bir sürümde bu adla sütun eklemenin neden kafa karıştırıcı olduğunu 3.50.6 üzerinde gösterelim:
-- SQLite 3.50.6 üzerinde çalıştırıldı (3.54.0 ve sonrası bu ALTER TABLE'ı reddeder)
CREATE TABLE urun(id INTEGER PRIMARY KEY, ad TEXT);
INSERT INTO urun(id, ad) VALUES (7, 'kalem');
ALTER TABLE urun ADD COLUMN rowid INTEGER;
SELECT name FROM pragma_table_info('urun');
-- çıktı:
-- id
-- ad
-- rowid
SELECT rowid, id, ad FROM urun; -- rowid artık yeni (boş) sütunu gösteriyor
-- çıktı: |7|kalem
SELECT _rowid_, oid FROM urun; -- gerçek rowid'e diğer adlarla ulaşılıyor
-- çıktı: 7|7Sütun eklendikten sonra rowid adı artık gizli anahtarı değil yeni ve boş sütunu gösteriyor; gerçek değere yalnızca diğer takma adlarla ulaşılabiliyor. Bu tür bir sütun, rowid'e dayanan kodu sessizce bozar. Yeni sürümdeki hata mesajının metni sürüm notunda verilmediği için burada göstermiyoruz. Rowid ve birincil anahtar ilişkisi PRIMARY KEY, rowid ve AUTOINCREMENT, tablo değişiklikleri ALTER TABLE yazısında.
format() içinde %J ve %j: JSON metni üretmek
Yerleşik printf() ve format() fonksiyonlarına iki yeni dönüşüm eklendi. Her ikisi de argümanı geçerli bir JSON metin değişmezi olarak yazar, yani tırnak ve kontrol karakterlerini JSON kurallarına göre kaçırır. Büyük harfli %J sonucu çift tırnak içine alır; küçük harfli %j tırnakları eklemez, böylece daha büyük bir JSON metninin parçası olarak kullanılabilir. %J için NULL argüman tırnaksız null üretir, %j için ise hiçbir şey üretmez. Hassasiyet alanı yazılan değil, argümandan alınan bayt (veya ! bayrağıyla kod noktası) sayısını belirler.
-- SQLite 3.54.0 veya sonrası gerekir (çalıştırılmadı)
SELECT format('{"ad":%J}', ad) FROM musteri;
SELECT format('{"not":"Müşteri: %j"}', ad) FROM musteri;Eski sürümlerde bu dönüşüm tanınmaz. Bizim denememizde 3.50.6, sonucun tamamı için NULL döndürdü; yani hata almadan boş bir değerle karşılaşabilirsiniz. Uygulamanız eski sürümlerde de çalışacaksa JSON üretmek için json_object() veya json_quote() gibi JSON fonksiyonlarını kullanmak daha güvenlidir. Metin biçimlendirme için SQLite metin fonksiyonları, JSON için SQLite JSON fonksiyonları yazılarına bakın.
-- SQLite 3.50.6 üzerinde: %J tanınmadığı için sonuç NULL
SELECT format('%J', 'a"b') IS NULL;
-- çıktı: 1Yeni tarih değiştiricileri: end of ve weekday -N
Tarih fonksiyonları iki eklenti aldı. end of month, end of year ve end of day değiştiricileri tarihi ilgili ayın, yılın veya günün son milisaniyesine ilerletir. weekday N değiştiricisi tarihi gerekirse ileri alarak haftanın N numaralı gününe getirir (pazar 0, pazartesi 1); 3.54.0 ile N negatif verildiğinde tarih geriye, en yakın önceki o güne gider. N değeri -6 ile +6 arasında olmalıdır ve tarih zaten istenen gündeyse değişmez. Belgedeki iki örnek:
-- SQLite 3.54.0 veya sonrası gerekir (belgedeki örnekler, çalıştırılmadı)
SELECT date('now', 'end of month'); -- bu ayın son günü
SELECT date('2026-01-01', 'end of year', 'weekday -5'); -- 2026'nın son cumasıEski sürümler bu değiştiricileri tanımaz ve fonksiyon NULL döndürür. Aynı sonuçlara eski sürümlerde de ulaşmak mümkündür: ayın son günü için ayın başına gidip bir ay ekleyip bir gün çıkarmak, yılın son cuması için yılın son gününden altı gün geri gidip ilk cumaya ilerlemek yeterlidir. Bu ifadeleri 3.50.6 üzerinde çalıştırdık:
-- SQLite 3.50.6 üzerinde: yeni değiştiriciler NULL döndürür
SELECT date('2026-02-10', 'end of month') IS NULL;
-- çıktı: 1
SELECT date('2026-01-01', 'end of year', 'weekday -5') IS NULL;
-- çıktı: 1
-- Eski sürümlerde aynı sonuçlara ulaşmanın bir yolu
SELECT date('2026-02-10', 'start of month', '+1 month', '-1 day');
-- çıktı: 2026-02-28
SELECT date('2026-12-31', '-6 days', 'weekday 5');
-- çıktı: 2026-12-25Değiştiricilerin tam listesi ve saat dilimi gibi incelikler SQLite tarih ve saat fonksiyonları yazısında anlatılıyor.
Sorgu planlayıcı, performans ve platform değişiklikleri

- İfade indeksleri ve UPDATE: İfade indeksi olan bir tabloda UPDATE yapılırken, indekslenen değer değişmiyorsa ifade indeksine dokunulmuyor.
- Sabit koşullar: "ifade OR TRUE" ve "ifade OR FALSE" biçimleri daha iyi optimize ediliyor.
- IN alt sorguları: IN işlecinin sağındaki SELECT içindeki DISTINCT yok sayılıyor.
- LIMIT 1 ile UNION: Tam olarak LIMIT 1 kullanan UNION sorguları daha hızlı ve daha az bellekle çalışıyor.
- Hız: Sürüm notu, speedtest1 testinde işlemci döngüleri sayılarak yapılan ölçümde 3.54.0'ın yaklaşık yüzde 4, bir yıl önceki 3.51.0'a göre ise yaklaşık yüzde 7,5 daha hızlı olduğunu belirtiyor. Not, sonucun iş yüküne, derleme seçeneklerine, işlemciye, derleyiciye ve işletim sistemine göre değişebileceğini de ekliyor.
- Geçici dosyalar: Destekleyen sistemlerde geçici dosyalar
O_TMPFILEile oluşturuluyor. - Windows: Windows XP ve öncesi ile Windows CE desteği bitti; SQLite artık Windows Vista veya sonrasını gerektiriyor. Mutex'ler için daha hızlı Slim Reader/Writer kilitleri kullanılıyor; UWP uygulamaları için
-DSQLITE_UWP=1derleme seçeneği var. Linux, macOS ve BSD derlemeleri bu değişiklikten etkilenmiyor.
Güvenlikle ilgili değişiklikler
Yetkilendirme geri çağrısı artık CREATE TABLE ifadelerinin DEFAULT yan tümcelerindeki SQL fonksiyonları için de çağrılıyor: hem ifade ilk çalıştırıldığında hem de varsayılan değer gerçekten kullanıldığında, ama veritabanı açılırken şema okunurken değil. Ayrıca sqlite3_limit() arayüzüne SQLITE_LIMIT_SCHEMA ve SQLITE_LIMIT_TRIGGER_STEPS sınırları eklendi; ilki güvenlik belgesindeki önerilen sınırlar tablosunda da yer alıyor. Bu ayarların bağlamı için SQLite güvenlik ayarları yazısına bakın. C tarafında yeni sqlite3_result_str() ve, yeni istemde de kullanılan, sqlite3_incomplete() arayüzleri eklendi.
Kısa hatırlatma: 3.51.0 ile gelenler
3.51.0, 4 Kasım 2025'te yayımlandı ve 3.51.1, 3.51.2, 3.51.3 yamalarını aldı. Son yama, 13 Mart 2026 tarihli 3.51.3, WAL-reset bozulma hatasını düzelten ilk sürümdü. 3.51 serisinin öne çıkan değişiklikleri şunlardır:
jsonb_each()vejsonb_tree()fonksiyonları eklendi; dizi ve nesne değerlerini JSONB olarak döndürürler.- Komut satırında
.timermikrosaniye hassasiyetine çıktı, box ve column biçimleri çift genişlikli karakterleri doğru hizalıyor,.openve komut satırına--ifexistsseçeneği geldi,.widthdeğerleri 30.000 ile sınırlandı. PRAGMA wal_checkpoint=NOOPkomutu eklendi.- STRICT tablolarda hesaplanan sütunlar için de tip denetimi uygulanıyor.
printf()veformat()içinde#bayrağıyla, tüm basamakları sıfır olan negatif sayılarda baştaki eksi işareti yazılmıyor;-0.00yerine0.00görmek için%#fkullanılabilir.- Bir uygulamanın
close()ile POSIX kilitlerini bozmasından kaynaklanan bozulmalara karşı direnç arttı. Bu savunmadaki nadir bir kilitlenme 3.51.2 ile düzeltildi. - 3.51.1, 3.51.0'daki bir optimizasyonun iç içe EXISTS sorgularında yol açtığı yanlış sonuçları düzeltti.
Yükseltme kontrol listesi
- 32 bit sistemlerde 3.54.0 yerine 3.54.1 veya sonrasını kullanın.
- Betiklerinizde ifadeleri
GOveya/ile bitiriyorsanız noktalı virgüle geçin. sqlite3_analyzerkullanan bakım betiklerinizi.diskusedkomutuna taşıyın.- Şemanızda ROWID, _ROWID_ veya OID adlı sütun varsa bu sütunlarla ilgili ALTER TABLE adımlarının artık hata vereceğini hesaba katın.
- Komut satırı çıktısını ayrıştıran araçlarınız boş sonuçta başlık satırı beklemiyorsa
--titles onile eski davranışı seçin. - Yeni tarih değiştiricilerini veya
%Jdönüşümünü kullanmadan önce uygulamanızın kullandığı SQLite kütüphanesinin sürümünüSELECT sqlite_version()ile doğrulayın; eski sürümler hata yerine NULL döndürebilir.
Sık Sorulan Sorular
Yeni istem betiklerimin çıktısını değiştirir mi?
İstem yalnızca etkileşimli oturumlarda görünür. Betikleri dosyadan veya borudan çalıştırdığınızda istem yazılmaz; ancak 3.53 ile başlayan çıktı biçimi değişikliklerine ve 3.54'teki boş sonuç başlığı davranışına dikkat edin.
Eski sqlite> istemini nasıl geri alırım?
Belgeye göre SQLITE_PS1 değişkenini sqlite>/40, SQLITE_PS2 değişkenini ...>/40 olarak ayarlamanız yeterlidir. Buradaki /40 sondaki boşluğu temsil eder.
diskused() fonksiyonunu uygulamamdan çağırabilir miyim?
Yalnızca eklentiyi ayrıca derleyip yüklerseniz. Fonksiyon komut satırı aracına gömülüdür, standart kütüphane dosyasında yoktur ve DBSTAT sanal tablosunu gerektirir.
3.52 sürümünü neden atlamış gibi görünüyoruz?
3.52.0 yayımlandıktan kısa süre sonra uyumluluk sorunları nedeniyle geri çekildi ve yerine 3.53.0 çıktı. Ayrıntılar SQLite 3.53 yenilikleri yazısında.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: SQLite öğrenme rehberi · SQLite 3.53 yenilikleri · SQLite CLI nokta komutları · SQLite tarih ve saat fonksiyonları · SQLite metin fonksiyonları · SQLite VACUUM