Skip to content
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
d5a4587
Add vector column search
sfc-gh-ext-simba-jf Apr 21, 2025
44b33ab
update insert
sfc-gh-ext-simba-jf Apr 21, 2025
7ca75fb
testing
sfc-gh-ext-simba-jf Apr 21, 2025
9d9e4c8
fix check-style
sfc-gh-ext-simba-jf Apr 21, 2025
30076e8
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Apr 25, 2025
374751c
Fix parsing
sfc-gh-ext-simba-jf Apr 28, 2025
75a65b6
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Apr 28, 2025
ff62bc0
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Apr 29, 2025
be0c4b0
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf May 6, 2025
2126ae4
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf May 7, 2025
a60567f
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf May 9, 2025
8dfda07
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf May 14, 2025
c32b59a
Hide tests to find error
sfc-gh-ext-simba-jf May 15, 2025
920de5a
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jun 10, 2025
3726af7
Fix null pointer
sfc-gh-ext-simba-jf Jun 10, 2025
c2bdd21
code review changes
sfc-gh-ext-simba-jf Jun 10, 2025
a82121c
Quick fix
sfc-gh-ext-simba-jf Jun 10, 2025
1239a7b
Allow tests to run
sfc-gh-ext-simba-jf Jun 11, 2025
bc1e910
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jun 13, 2025
05373b4
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jun 17, 2025
1c1694e
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jun 23, 2025
cbf77d4
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jun 25, 2025
b0165ee
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-pbulawa Jul 2, 2025
a6c3d0d
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jul 2, 2025
038d9ae
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jul 8, 2025
9b81c7d
Added test case
sfc-gh-ext-simba-jf Jul 8, 2025
fc804f5
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-hx Jul 16, 2025
0d60843
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-hx Jul 21, 2025
b343ca2
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jul 22, 2025
8d4a709
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Jul 29, 2025
c54e092
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Aug 12, 2025
63e05a5
Review change
sfc-gh-ext-simba-jf Aug 12, 2025
c7645bb
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Aug 19, 2025
561b6e1
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Aug 25, 2025
5defb74
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Sep 3, 2025
0fecccf
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Sep 4, 2025
68fb86c
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Sep 8, 2025
bfdad04
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Sep 12, 2025
eac2ba5
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Sep 25, 2025
356b6e3
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-vb Oct 10, 2025
0ef1c07
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-vb Oct 14, 2025
a9a5731
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-vb Oct 16, 2025
51a3cdd
Code review updates
sfc-gh-ext-simba-jf Oct 16, 2025
0c35038
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-jf Oct 21, 2025
5cb2ee9
Merge branch 'master' into SNOW-1936378-Add-support-for-vector-type-f…
sfc-gh-ext-simba-hx Oct 22, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,9 @@ public void run() {
+ "("
+ _loader.getColumnsAsString()
+ ")"
+ " SELECT * FROM \""
+ " SELECT "
+ _loader.getStageColumnsAsString()
+ " FROM \""
+ stage.getId()
+ "\"";
break;
Expand Down
70 changes: 70 additions & 0 deletions src/main/java/net/snowflake/client/loader/StreamLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
Expand Down Expand Up @@ -83,6 +85,11 @@ public class StreamLoader implements Loader, Runnable {

private List<String> _columns;

private Map<String, Integer> _vectorColumnsNameAndSize = new HashMap<String, Integer>();

// Set vector type to float by default.
private String _vectorType = "float";

private List<String> _keys;

private long _batchRowSize = DEFAULT_BATCH_ROW_SIZE;
Expand Down Expand Up @@ -178,6 +185,7 @@ public void setProperty(LoaderProperty property, Object value) {
typeCheckedColumns.add((String) e);
}
_columns = typeCheckedColumns;
setVectorColumns();
}
break;
case keys:
Expand Down Expand Up @@ -598,6 +606,34 @@ private void truncateTargetTable() {
}
}

public void setVectorColumnType(String vectorType) {
this._vectorType = vectorType;
}

public void setVectorColumns() {
try {
DatabaseMetaData dbmd = _processConn.getMetaData();
for (String col : _columns) {
try (ResultSet rs = dbmd.getColumns(_database, _schema, _table, col)) {
rs.next();
if (isColumnTypeVector(rs.getString(6))) {
_vectorColumnsNameAndSize.put(col, rs.getInt(7));
}
}
}
} catch (SQLException e) {
logger.error(e.getMessage(), e);
abort(new Loader.ConnectionError(Utils.getCause(e)));
}
}

private boolean isColumnTypeVector(String col) {
if (col != null && col.equalsIgnoreCase("vector")) {
return true;
}
return false;
}

@Override
public void run() {
try {
Expand Down Expand Up @@ -750,6 +786,10 @@ List<String> getColumns() {
return this._columns;
}

Map<String, Integer> getVectorColumns() {
return this._vectorColumnsNameAndSize;
}

String getColumnsAsString() {
// comma separate list of column names
StringBuilder sb = new StringBuilder("\"");
Expand Down Expand Up @@ -904,4 +944,34 @@ public int getSubmittedRowCount() {
void setTestMode(boolean mode) {
this._testMode = mode;
}

public String getStageColumnsAsString() {
// if there are no vector columns in the target table just select * is needed from the staging
// table.
if (_vectorColumnsNameAndSize.isEmpty()) {
return "*";
}

StringBuilder sb = new StringBuilder();
for (int i = 0; i < _columns.size(); i++) {
String colName = _columns.get(i);
if (_vectorColumnsNameAndSize.containsKey(colName)) {
sb.append(
colName
+ "::VECTOR("
+ _vectorType
+ ", "
+ _vectorColumnsNameAndSize.get(colName)
+ ")");
} else {
sb.append("\"");
sb.append(colName);
sb.append("\"");
}
if (i != _columns.size() - 1) {
sb.append(", ");
}
}
return sb.toString();
}
}
125 changes: 125 additions & 0 deletions src/test/java/net/snowflake/client/loader/LoaderLatestIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -201,4 +201,129 @@ public void testKeyClusteringTable() throws Exception {
}
}
}

@Test
private void testVectorColumnInTable() throws Exception {
String tableName = "VECTOR_TABLE";
try {
testConnection
.createStatement()
.execute(
String.format("CREATE OR REPLACE TABLE %s (vector_col VECTOR(FLOAT, 3))", tableName));

TestDataConfigBuilder tdcb = new TestDataConfigBuilder(testConnection, putConnection);
tdcb.setOperation(Operation.INSERT)
.setStartTransaction(true)
.setTruncateTable(true)
.setTableName(tableName)
.setColumns(Arrays.asList("vector_col"));
StreamLoader loader = tdcb.getStreamLoader();
TestDataConfigBuilder.ResultListener listener = tdcb.getListener();
loader.start();

loader.submitRow(new Object[] {"[12, 14.0, 100]"});
loader.setVectorColumnType("float");
loader.finish();
int submitted = listener.getSubmittedRowCount();
assertThat("submitted rows", submitted, equalTo(1));

} finally {
testConnection.createStatement().execute(String.format("DROP TABLE IF EXISTS %s", tableName));
}
}

@Test
private void testMultipleFloatVectorColumnsInTable() throws Exception {
String tableName = "VECTOR_TABLE";
try {
testConnection
.createStatement()
.execute(
String.format(
"CREATE OR REPLACE TABLE %s (vec1 VECTOR(FLOAT, 3), vec2 VECTOR(FLOAT, 3))",
tableName));

TestDataConfigBuilder tdcb = new TestDataConfigBuilder(testConnection, putConnection);
tdcb.setOperation(Operation.INSERT)
.setStartTransaction(true)
.setTruncateTable(true)
.setTableName(tableName)
.setColumns(Arrays.asList("vector_col"));
StreamLoader loader = tdcb.getStreamLoader();
TestDataConfigBuilder.ResultListener listener = tdcb.getListener();
loader.start();

loader.submitRow(new Object[] {"[12, 14.0, 100]", "[12, 14.0, 100]"});
loader.finish();
int submitted = listener.getSubmittedRowCount();
assertThat("submitted rows", submitted, equalTo(1));

} finally {
testConnection.createStatement().execute(String.format("DROP TABLE IF EXISTS %s", tableName));
}
}

@Test
private void testMultipleIntVectorColumnsInTable() throws Exception {
String tableName = "VECTOR_TABLE";
try {
testConnection
.createStatement()
.execute(
String.format(
"CREATE OR REPLACE TABLE %s (vec1 VECTOR(INT, 3), vec2 VECTOR(INT, 3))",
tableName));

TestDataConfigBuilder tdcb = new TestDataConfigBuilder(testConnection, putConnection);
tdcb.setOperation(Operation.INSERT)
.setStartTransaction(true)
.setTruncateTable(true)
.setTableName(tableName)
.setColumns(Arrays.asList("vector_col"));
StreamLoader loader = tdcb.getStreamLoader();
TestDataConfigBuilder.ResultListener listener = tdcb.getListener();
loader.start();

loader.submitRow(new Object[] {"[12, 14, 100]", "[12, 14, 100]"});
loader.setVectorColumnType("int");
loader.finish();
int submitted = listener.getSubmittedRowCount();
assertThat("submitted rows", submitted, equalTo(1));

} finally {
testConnection.createStatement().execute(String.format("DROP TABLE IF EXISTS %s", tableName));
}
}

@Test
private void testMultipleTypesWithVectorColumnsInTable() throws Exception {
String tableName = "VECTOR_TABLE";
try {
testConnection
.createStatement()
.execute(
String.format(
"CREATE OR REPLACE TABLE %s (vec1 VECTOR(FLOAT, 3), vec2 VECTOR(FLOAT, 3), ID int, colA varchar(255), colB date)",
tableName));

TestDataConfigBuilder tdcb = new TestDataConfigBuilder(testConnection, putConnection);
tdcb.setOperation(Operation.INSERT)
.setStartTransaction(true)
.setTruncateTable(true)
.setTableName(tableName)
.setColumns(Arrays.asList("vector_col"));
StreamLoader loader = tdcb.getStreamLoader();
TestDataConfigBuilder.ResultListener listener = tdcb.getListener();
loader.start();

loader.setVectorColumnType("float");
loader.submitRow(new Object[] {"[12, 14.0, 100]", "[12, 14.0, 100]", 10, "abc", new Date()});
loader.finish();
int submitted = listener.getSubmittedRowCount();
assertThat("submitted rows", submitted, equalTo(1));

} finally {
testConnection.createStatement().execute(String.format("DROP TABLE IF EXISTS %s", tableName));
}
}
}
Loading