Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
c1ef6a5
refactor: use new parser for autocompletion and query detection
emrberk Feb 13, 2026
f280d41
cleanup in monaco utils, remove viewport scoping from run all flow, f…
emrberk Feb 16, 2026
8779b99
add JIT query validation and fix dot qualified autocompletion
emrberk Feb 16, 2026
dfbdf7f
submodule
emrberk Feb 16, 2026
cc2a48f
Merge remote-tracking branch 'origin/main' into refactor/new-parser
emrberk Feb 16, 2026
e2a26b2
use dot as a commit character
emrberk Feb 17, 2026
3a0b868
fix query separation issue, handle double quotes, adapt to new parser
emrberk Feb 23, 2026
751cff7
increase bundlewatch limit
emrberk Feb 23, 2026
04d88da
submodule
emrberk Feb 23, 2026
d1b3623
remove leftover index calculation
emrberk Feb 23, 2026
c96e4f3
autocomplete test fixes
emrberk Feb 23, 2026
03b2376
restrict suggestions to words, remove newline autocomplete trigger an…
emrberk Feb 23, 2026
aedc572
add web console autocomplete tests
emrberk Feb 23, 2026
e7e6868
submodule
emrberk Feb 23, 2026
ebb1bbc
include table details test fix
emrberk Feb 24, 2026
cd4c08a
bump parser version
emrberk Feb 25, 2026
10d4fa1
Merge remote-tracking branch 'origin/main' into refactor/new-parser
emrberk Feb 25, 2026
51754d5
add horizon join units support
emrberk Mar 3, 2026
0084e77
Merge branch 'main' into refactor/new-parser
emrberk Mar 3, 2026
617952c
submodule
emrberk Mar 3, 2026
3f8809f
bump parser to 0.1.3, prevent suggesting the same word, auto-trigger …
emrberk Mar 4, 2026
f7f11ef
update tests
emrberk Mar 12, 2026
5f073b0
Merge remote-tracking branch 'origin/main' into refactor/new-parser
emrberk Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion e2e/questdb
Submodule questdb updated 65 files
+367 −0 benchmarks/src/main/java/org/questdb/VarcharSliceBenchmark.java
+5 −1 core/rust/qdb-core/src/col_driver/mod.rs
+5 −1 core/rust/qdb-core/src/col_type.rs
+162 −19 core/rust/qdbr/benches/decode_page.rs
+17 −0 core/rust/qdbr/src/parquet/qdb_metadata.rs
+208 −3 core/rust/qdbr/src/parquet_read/column_sink/var.rs
+90 −5 core/rust/qdbr/src/parquet_read/decode.rs
+762 −8 core/rust/qdbr/src/parquet_read/decoders/delta_binary_packed.rs
+1,272 −0 core/rust/qdbr/src/parquet_read/decoders/delta_length_array.rs
+6 −0 core/rust/qdbr/src/parquet_read/decoders/dictionary.rs
+7 −1 core/rust/qdbr/src/parquet_read/decoders/mod.rs
+1 −0 core/rust/qdbr/src/parquet_read/decoders/plain.rs
+1 −0 core/rust/qdbr/src/parquet_read/decoders/rle.rs
+2,148 −0 core/rust/qdbr/src/parquet_read/decoders/rle_dict_varchar_slice.rs
+1 −0 core/rust/qdbr/src/parquet_read/decoders/rle_dictionary.rs
+7 −0 core/rust/qdbr/src/parquet_read/mod.rs
+175 −23 core/rust/qdbr/src/parquet_read/row_groups.rs
+2 −2 core/rust/qdbr/src/parquet_read/slicer/mod.rs
+43 −13 core/rust/qdbr/src/parquet_write/file.rs
+1 −1 core/rust/qdbr/src/parquet_write/mod.rs
+27 −14 core/rust/qdbr/src/parquet_write/schema.rs
+428 −1 core/rust/qdbr/src/parquet_write/varchar.rs
+130 −1 core/rust/qdbr/tests/common/mod.rs
+213 −0 core/rust/qdbr/tests/row_groups.rs
+3 −0 core/rust/qdbr/tests/strings.rs
+1,632 −0 core/rust/qdbr/tests/varchar_slice.rs
+ core/src/main/bin/linux-aarch64/libjemalloc.so
+26 −13 core/src/main/java/io/questdb/cairo/ColumnType.java
+31 −0 core/src/main/java/io/questdb/cairo/VarcharTypeDriver.java
+39 −2 core/src/main/java/io/questdb/cairo/map/MapFactory.java
+39 −12 core/src/main/java/io/questdb/cairo/map/UnorderedVarcharMap.java
+6 −0 core/src/main/java/io/questdb/cairo/sql/PageFrameFilteredMemoryRecord.java
+8 −2 core/src/main/java/io/questdb/cairo/sql/PageFrameMemoryPool.java
+6 −0 core/src/main/java/io/questdb/cairo/sql/PageFrameMemoryRecord.java
+5 −2 core/src/main/java/io/questdb/cutlass/parquet/CopyExportRequestTask.java
+4 −1 core/src/main/java/io/questdb/cutlass/parquet/HybridColumnMaterializer.java
+1 −1 core/src/main/java/io/questdb/griffin/FunctionParser.java
+11 −2 core/src/main/java/io/questdb/griffin/LoopingRecordToRowCopier.java
+13 −3 core/src/main/java/io/questdb/griffin/RecordToRowCopierUtils.java
+51 −41 core/src/main/java/io/questdb/griffin/SqlCodeGenerator.java
+1 −1 core/src/main/java/io/questdb/griffin/SqlCompilerImpl.java
+15 −7 core/src/main/java/io/questdb/griffin/engine/functions/table/ReadParquetRecordCursor.java
+1 −1 core/src/main/java/io/questdb/griffin/engine/groupby/GroupByRecordCursorFactory.java
+1 −1 core/src/main/java/io/questdb/griffin/engine/join/WindowJoinFastRecordCursorFactory.java
+21 −4 core/src/main/java/io/questdb/griffin/engine/orderby/LimitedSizeLongTreeChain.java
+2 −2 core/src/main/java/io/questdb/griffin/engine/table/GroupByMapFragment.java
+1 −1 core/src/main/java/io/questdb/jit/CompiledFilterIRSerializer.java
+16 −1 core/src/main/java/io/questdb/std/str/Utf8SplitString.java
+ core/src/main/resources/io/questdb/bin/darwin-aarch64/libquestdbr.dylib
+ core/src/main/resources/io/questdb/bin/darwin-x86-64/libquestdbr.dylib
+ core/src/main/resources/io/questdb/bin/linux-aarch64/libquestdb.so
+ core/src/main/resources/io/questdb/bin/linux-aarch64/libquestdbr.so
+ core/src/main/resources/io/questdb/bin/linux-x86-64/libquestdbr.so
+ core/src/main/resources/io/questdb/bin/windows-x86-64/libquestdb.dll
+ core/src/main/resources/io/questdb/bin/windows-x86-64/questdbr.dll
+12 −2 core/src/test/java/io/questdb/test/cairo/ColumnTypeTest.java
+249 −0 core/src/test/java/io/questdb/test/cairo/VarcharTypeDriverSliceTest.java
+159 −68 core/src/test/java/io/questdb/test/cairo/map/UnorderedVarcharMapTest.java
+3 −0 core/src/test/java/io/questdb/test/cutlass/http/ExpParquetExportTest.java
+64 −0 core/src/test/java/io/questdb/test/griffin/CopyExportTest.java
+107 −0 core/src/test/java/io/questdb/test/griffin/WindowJoinTest.java
+1 −0 core/src/test/java/io/questdb/test/griffin/engine/functions/catalogue/TypeOfFunctionFactoryTest.java
+1,033 −0 core/src/test/java/io/questdb/test/griffin/engine/table/parquet/ReadParquetFunctionTest.java
+2 −2 core/src/test/java/io/questdb/test/griffin/engine/table/parquet/StreamingParquetBenchmarkTest.java
+6 −7 core/src/test/java/io/questdb/test/tools/TestUtils.java
132 changes: 107 additions & 25 deletions e2e/tests/console/editor.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -654,14 +654,14 @@ describe("autocomplete", () => {
const assertFrom = () =>
cy.getAutocomplete().within(() => {
cy.getMonacoListRow()
.should("have.length", 4)
.should("have.length", 1)
.eq(0)
.should("contain", "FROM")
})
cy.typeQuery("select * from")
cy.typeQuery("select * fro")
assertFrom()
cy.clearEditor()
cy.typeQuery("SELECT * FROM")
cy.typeQuery("SELECT * FRO")
assertFrom()
})

Expand All @@ -681,37 +681,127 @@ describe("autocomplete", () => {
// Columns
.should("contain", "secret")
.should("contain", "public")
// Tables list for the `secret` column
// list the tables containing `secret` column
.should("contain", "my_secrets, my_secrets2")
.clearEditor()
})

it("should suggest columns on SELECT only when applicable", () => {
cy.typeQuery("select secret")
cy.getAutocomplete().should("contain", "secret").eq(0).click()
cy.typeQuery(", public")
cy.getAutocomplete().should("contain", "public").eq(0).click()
cy.typeQuery(" ")
cy.getAutocomplete().should("not.be.visible")
cy.typeQuery("select secre")
cy.getAutocomplete().should("be.visible")
cy.typeQuery("{enter}")
cy.typeQuery(", publi")
cy.getAutocomplete().should("be.visible")
cy.typeQuery("{enter}")
cy.getAutocomplete().should("contain", "FROM")
cy.clearEditor()
})

it("should suggest correct columns on 'where' filter", () => {
cy.typeQuery("select * from my_secrets where ")
cy.getAutocomplete().eq(0).should("contain", "secret").clearEditor()
})

it("should suggest correct columns on 'on' clause", () => {
cy.typeQuery("select * from my_secrets join my_publics on ")
cy.getAutocomplete()
.should("contain", "public")
.should("contain", "secret")
.should("not.contain", "public")
.clearEditor()
})

it("should suggest correct columns on 'on' clause", () => {
cy.typeQuery("select * from my_secrets join my_publics on ")
it("should suggest columns for dot-qualified alias", () => {
cy.typeQuery("select * from my_secrets s where s.")
cy.getAutocomplete().should("contain", "secret").clearEditor()
})

it("should replace partial text when accepting a suggestion", () => {
cy.typeQuery("select * from my_se")
cy.getAutocomplete().should("contain", "my_secrets")
cy.typeQuery("{enter}")
cy.window().then((win) => {
const value = win.monaco.editor.getEditors()[0].getValue()
expect(value).to.match(/select \* from my_secrets/)
expect(value).to.not.contain("my_semy_secrets")
})
cy.clearEditor()
})

it("should suggest the new keyword after accepting a suggestion", () => {
cy.typeQuery("CR")
cy.getAutocomplete().should("contain", "CREATE")
cy.typeQuery("{enter}")
cy.typeQuery("T")
cy.getAutocomplete().should("contain", "TABLE")
cy.typeQuery("{enter}")
cy.getAutocomplete().should("contain", "IF")
cy.typeQuery("{enter}")
cy.getAutocomplete().should("contain", "NOT")
cy.typeQuery("{enter}")
cy.getAutocomplete().should("contain", "EXISTS")
cy.typeQuery("{enter}")
cy.clearEditor()
})

it("should not suggest the very same keyword when it's already typed", () => {
cy.typeQuery("SELECT * FROM")
cy.getAutocomplete().should("not.be.visible")

cy.typeQuery(`${ctrlOrCmd}i`)
cy.getAutocomplete()
.should("be.visible")
.should("contain", "No suggestions")
cy.clearEditor()
})

it("should suggest tables in second statement of multi-statement buffer", () => {
cy.typeQuery("select * from my_secrets;{enter}select * from ")
cy.getAutocomplete()
.should("contain", "my_publics.public")
.should("contain", "my_secrets.secret")
.should("contain", "my_secrets")
.should("contain", "my_publics")
.clearEditor()
})

it("should not suggest anything immediately after opening parenthesis", () => {
cy.typeQuery("select count(")
cy.getAutocomplete().should("not.be.visible")
cy.clearEditor()
})

it("should suggest after parenthesis followed by space", () => {
cy.typeQuery("select count( ")
cy.getAutocomplete().should("be.visible").clearEditor()
})

it("should not suggest inside line comments", () => {
cy.typeQuery("-- select * from ")
cy.getAutocomplete().should("not.be.visible").clearEditor()
})

it("should not suggest in dead space between statements", () => {
cy.typeQuery("select 1;")
cy.typeQuery("{enter}{enter}")
cy.getAutocomplete().should("not.be.visible").clearEditor()
})

it("should display keywords in uppercase", () => {
cy.typeQuery("select * from my_secrets whe")
cy.getAutocomplete().should("contain", "WHERE")
// Should not contain lowercase variant
cy.getAutocomplete().within(() => {
cy.getMonacoListRow().first().should("contain", "WHERE")
})
cy.clearEditor()
})

it("should suggest CTE name in FROM clause", () => {
cy.typeQuery("with cte as (select 1) select * from ")
cy.getAutocomplete().should("contain", "cte").clearEditor()
})

it("should not suggest inside block comments", () => {
cy.typeQuery("/* select * from ")
cy.getAutocomplete().should("not.be.visible").clearEditor()
})

after(() => {
cy.loadConsoleWithAuth()
;["my_publics", "my_secrets", "my_secrets2"].forEach((table) => {
Expand All @@ -730,14 +820,6 @@ describe("errors", () => {
cy.clearEditor()
})

it("should mark '(200000)' as error", () => {
const query = `create table test (\ncol symbol index CAPACITY (200000)`
cy.typeQuery(query)
cy.runLine()
cy.matchErrorMarkerPosition({ left: 237, width: 67 })
cy.getCollapsedNotifications().should("contain", "bad integer")
})

it("should mark date position as error", () => {
const query = `select * from long_sequence(1) where cast(x as timestamp) = '2012-04-12T12:00:00A'`
cy.typeQuery(query)
Expand Down
4 changes: 0 additions & 4 deletions e2e/tests/console/tableDetails.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -694,8 +694,6 @@ describe("TableDetailsDrawer", () => {
"contain",
"AI Assistant is not configured",
)
// Workaround - tooltip grace area causes problems in the test when quickly switching multiple triggers.
// Move mouse away from trigger for 200ms
cy.getByDataHook("table-details-tab-monitoring").realHover()
cy.wait(200)

Expand Down Expand Up @@ -746,8 +744,6 @@ describe("TableDetailsDrawer", () => {
"contain",
"Schema access is not granted to this model",
)
// Workaround - tooltip grace area causes problems in the test when quickly switching multiple triggers.
// Move mouse away from trigger for 200ms
cy.getByDataHook("table-details-tab-monitoring").realHover()
cy.wait(200)

Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"@monaco-editor/react": "^4.7.0",
"@phosphor-icons/react": "^2.1.10",
"@popperjs/core": "2.4.2",
"@questdb/sql-grammar": "1.4.2",
"@questdb/sql-parser": "0.1.3",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-context-menu": "^2.2.16",
"@radix-ui/react-dialog": "^1.1.15",
Expand Down Expand Up @@ -179,7 +179,7 @@
},
{
"path": "dist/assets/index-*.js",
"maxSize": "2.5MB",
"maxSize": "3MB",
"compression": "none"
},
{
Expand Down
Loading
Loading