From da6d1ee03df8f00edef8011a98fbb4e17e57d540 Mon Sep 17 00:00:00 2001 From: Yuan Date: Fri, 12 Mar 2021 15:26:59 +0800 Subject: [PATCH] [NSE-86] Merge Arrow Data Source (#152) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ARROW-DATA-SOURCE-1] Reorganize the source code for the new repository organization * [ARROW-DATA-SOURCE-1] Make compiling succeed * [ADS-2] Fix RAM usage CI (#3) * Update tpch.yml * Update report_ram_log.yml * Update report_ram_log.yml * Delete github-ci-fix * Delete github-ci-fix2 * [Arrow-Data-Source-4]Add mkdocs.yml and update docs * [ADS-6] Add utility methods to check leaked Allocators/MemoryPools (#7) Close #6 * [NSE-51] Update ArrowWritableColumnVector * [ADS-9][Parquet] Parquet data source not replaced by default (#10) * [ADS-9][Parquet] Parquet data source not replaced by default * Code style * [ADS-13] Validate metric TaskMetrics.peakExecutionMemory for native SQL engine (#14) Closes #13 * [ADS-11]Modify title check and automatic link to Issues for PRs (#12) * [ADS-16] Upgrade Arrow version to 3.0.0 (#17) Closes #16 * Initialize new repo * Move arrow data source files to arrow-data-source directory * move native sql files to native-sql-engine folder * [NSE-86] Add root pom.xml; Remove native-sql-engine/core/ArrowWritableColumnVector.java (#88) * fix github actions Signed-off-by: Yuan Zhou * fix building & CI Signed-off-by: Yuan Zhou Co-authored-by: Chen Haifeng Co-authored-by: zhixingheyi-tianĀ  Co-authored-by: Hongze Zhang Co-authored-by: HongW2019 Co-authored-by: Hongze Zhang Co-authored-by: Rui Mo --- .clang-format | 20 - .github/workflows/report_ram_log.yml | 2 +- .github/workflows/tpch.yml | 4 +- .github/workflows/unittests.yml | 2 +- .gitignore | 45 ++ .gitmodules | 3 - .../.github/PULL_REQUEST_TEMPLATE | 12 + .../.github/workflows/dev_cron.yml | 58 +++ .../.github/workflows/dev_cron/issues_link.js | 70 +++ .../.github/workflows/dev_cron/title_check.js | 53 ++ .../.github/workflows/dev_cron/title_check.md | 33 ++ .../.github/workflows/report_ram_log.yml | 72 +++ arrow-data-source/.github/workflows/tpch.yml | 90 ++++ .../.github/workflows/unittests.yml | 61 +++ .travis.yml => arrow-data-source/.travis.yml | 0 .../CHANGELOG.md | 0 LICENSE.txt => arrow-data-source/LICENSE.txt | 0 arrow-data-source/README.md | 235 +++++++++ arrow-data-source/common/pom.xml | 77 +++ .../v2/arrow/NativeSQLMemoryConsumer.java | 59 +++ .../v2/arrow/NativeSQLMemoryMetrics.java | 44 ++ .../arrow/SparkManagedAllocationListener.java | 43 ++ .../SparkManagedReservationListener.java | 46 ++ .../datasources/v2/arrow/Spiller.java | 31 ++ .../vectorized/ArrowWritableColumnVector.java | 1 - .../v2/arrow/SparkMemoryUtils.scala | 229 +++++++++ .../v2/arrow/SparkSchemaUtils.scala | 34 ++ .../docs}/ApacheArrowInstallation.md | 0 .../docs}/Configuration.md | 0 .../docs}/Installation.md | 0 .../docs}/InstallationNotes.md | 0 .../docs}/OAP-Developer-Guide.md | 0 .../docs}/OAP-Installation-Guide.md | 0 .../docs}/Prerequisite.md | 0 .../docs}/SparkInstallation.md | 0 .../docs}/User-Guide.md | 0 .../docs/image/arrowdatasource_validation.png | Bin 0 -> 47609 bytes .../docs}/image/columnar.png | Bin .../docs}/image/core_arch.jpg | Bin .../docs}/image/dataset.png | Bin ...ecision_support_bench1_result_by_query.png | Bin ...ecision_support_bench1_result_in_total.png | Bin ...ecision_support_bench2_result_by_query.png | Bin ...ecision_support_bench2_result_in_total.png | Bin .../docs}/image/kernel.png | Bin .../docs}/image/nativesql_arch.png | Bin .../docs}/image/performance.png | Bin .../docs}/image/shuffle.png | Bin {docs => arrow-data-source/docs}/index.md | 0 arrow-data-source/mkdocs.yml | 23 + arrow-data-source/parquet/pom.xml | 27 + .../v2/parquet/ServiceLoaderUtil.scala | 32 ++ .../parquet/ParquetFileFormat.scala | 478 ++++++++++++++++++ .../parquet/ParquetFileFormatIndicator.scala | 22 + .../datasources/parquet/ParquetSQLConf.scala | 40 ++ .../v2/parquet/ParquetFileFormatTest.scala | 99 ++++ arrow-data-source/pom.xml | 182 +++++++ .../resource/arrowdatasource_validation.png | Bin 0 -> 47609 bytes arrow-data-source/standard/pom.xml | 105 ++++ ...pache.spark.sql.sources.DataSourceRegister | 1 + .../spark/sql/DataFrameReaderImplicits.scala | 49 ++ .../datasources/arrow/ArrowFileFormat.scala | 172 +++++++ .../v2/arrow/ArrowDataSourceV2.scala | 42 ++ .../datasources/v2/arrow/ArrowFilters.scala | 206 ++++++++ .../datasources/v2/arrow/ArrowOptions.scala | 42 ++ .../arrow/ArrowPartitionReaderFactory.scala | 129 +++++ .../datasources/v2/arrow/ArrowSQLConf.scala | 35 ++ .../datasources/v2/arrow/ArrowScan.scala | 66 +++ .../v2/arrow/ArrowScanBuilder.scala | 57 +++ .../datasources/v2/arrow/ArrowTable.scala | 52 ++ .../datasources/v2/arrow/ArrowUtils.scala | 169 +++++++ .../standard/src/test/resources}/cars.csv | 0 .../arrow/ArrowDataSourceTPCHBasedTest.scala | 286 +++++++++++ .../arrow/ArrowDataSourceTest.scala | 303 +++++++++++ cpp/.gitignore | 24 - dep/arrow-data-source | 1 - {core => native-sql-engine/core}/pom.xml | 10 +- .../VectorizedParquetArrowReader.java | 0 .../oap/datasource/parquet/ParquetReader.java | 0 .../parquet/ParquetReaderJniWrapper.java | 0 .../oap/datasource/parquet/ParquetWriter.java | 0 .../parquet/ParquetWriterJniWrapper.java | 0 .../oap/expression/ArrowColumnarBatch.java | 0 .../ColumnarArithmeticWithGandiva.java | 0 .../vectorized/AdaptorReferenceManager.java | 0 .../intel/oap/vectorized/ArrowBufBuilder.java | 0 .../ArrowCompressedStreamReader.java | 0 .../oap/vectorized/ArrowFieldNodeBuilder.java | 0 .../vectorized/ArrowRecordBatchBuilder.java | 0 .../ArrowRecordBatchBuilderImpl.java | 0 .../intel/oap/vectorized/BatchIterator.java | 0 .../vectorized/CompressedVectorLoader.java | 0 .../oap/vectorized/ExpressionEvaluator.java | 0 .../ExpressionEvaluatorJniWrapper.java | 0 .../com/intel/oap/vectorized/JniUtils.java | 0 .../intel/oap/vectorized/MetricsObject.java | 0 .../oap/vectorized/NativePartitioning.java | 0 .../vectorized/NativeSerializableObject.java | 0 .../oap/vectorized/PartitionFileInfo.java | 0 .../oap/vectorized/SerializableObject.java | 0 .../ShuffleDecompressionJniWrapper.java | 0 .../vectorized/ShuffleSplitterJniWrapper.java | 0 .../com/intel/oap/vectorized/SplitResult.java | 0 .../core}/src/main/java/test | 0 .../com/intel/oap/ColumnarGuardRule.scala | 0 .../scala/com/intel/oap/ColumnarPlugin.scala | 0 .../com/intel/oap/ColumnarPluginConfig.scala | 0 .../oap/execution/BroadcastColumnarRDD.scala | 0 .../oap/execution/CoalesceBatchesExec.scala | 0 .../ColumnarBasicPhysicalOperators.scala | 0 .../oap/execution/ColumnarBatchScanExec.scala | 0 .../ColumnarBroadcastHashJoinExec.scala | 0 .../oap/execution/ColumnarDataSourceRDD.scala | 0 .../oap/execution/ColumnarExpandExec.scala | 0 .../execution/ColumnarHashAggregateExec.scala | 0 .../ColumnarShuffledHashJoinExec.scala | 0 .../oap/execution/ColumnarSortExec.scala | 0 .../execution/ColumnarSortMergeJoinExec.scala | 0 .../ColumnarWholeStageCodegenExec.scala | 0 .../oap/execution/ColumnarWindowExec.scala | 0 .../execution/DataToArrowColumnarExec.scala | 0 .../execution/RowToArrowColumnarExec.scala | 0 .../intel/oap/expression/CodeGeneration.scala | 0 .../oap/expression/ColumnarArithmetic.scala | 0 .../expression/ColumnarBinaryExpression.scala | 0 .../expression/ColumnarBinaryOperator.scala | 0 .../expression/ColumnarBoundAttribute.scala | 0 .../expression/ColumnarCaseWhenOperator.scala | 0 .../expression/ColumnarCoalesceOperator.scala | 0 .../expression/ColumnarConcatOperator.scala | 0 .../ColumnarConditionProjector.scala | 0 .../ColumnarConditionedProbeJoin.scala | 0 .../oap/expression/ColumnarExpression.scala | 0 .../ColumnarExpressionConverter.scala | 0 .../intel/oap/expression/ColumnarFilter.scala | 0 .../expression/ColumnarHashAggregation.scala | 0 .../oap/expression/ColumnarIfOperator.scala | 0 .../oap/expression/ColumnarInOperator.scala | 0 .../expression/ColumnarInSetOperator.scala | 0 .../oap/expression/ColumnarLiterals.scala | 0 .../expression/ColumnarNamedExpressions.scala | 0 .../oap/expression/ColumnarProjection.scala | 0 .../expression/ColumnarRoundOperator.scala | 0 .../expression/ColumnarSortMergeJoin.scala | 0 .../intel/oap/expression/ColumnarSorter.scala | 0 .../oap/expression/ColumnarSubquery.scala | 0 .../expression/ColumnarTernaryOperator.scala | 0 .../expression/ColumnarUnaryOperator.scala | 0 .../intel/oap/expression/ConverterUtils.scala | 0 .../ArrowColumnarBatchSerializer.scala | 0 .../CloseableColumnBatchIterator.scala | 0 .../shuffle/ColumnarShuffleDependency.scala | 0 .../spark/shuffle/ColumnarShuffleWriter.scala | 0 .../shuffle/sort/ColumnarShuffleManager.scala | 0 .../ColumnarBroadcastExchangeExec.scala | 0 .../ColumnarCollapseCodegenStages.scala | 0 .../sql/execution/ColumnarExchange.scala | 0 .../execution/ColumnarHashedRelation.scala | 0 .../ColumnarShuffleExchangeExec.scala | 0 .../execution/ShuffledColumnarBatchRDD.scala | 0 .../adaptive/AdaptiveSparkPlanExec.scala | 0 .../ColumnarCustomShuffleReaderExec.scala | 0 .../execution/adaptive/QueryStageExec.scala | 0 ...VectorizedFilePartitionReaderHandler.scala | 0 .../apache/spark/sql/util/ArrowUtils.scala | 0 .../spark/sql/util/OASPackageBridge.scala | 0 .../apache/spark/sql/util/StructTypeFWD.scala | 0 .../apache/spark/util/ExecutorManager.scala | 0 .../apache/spark/util/UserAddedJarUtils.scala | 0 .../datasource/parquet/ParquetReadTest.java | 0 .../parquet/ParquetReadWriteTest.java | 0 ...4fe9-87f2-770ef3551442-c000.snappy.parquet | Bin .../java/com/intel/oap/tpc/MallocUtils.java | 0 .../checkpoint-version-2.1.0/metadata | 0 .../checkpoint-version-2.1.0/offsets/0 | 0 .../checkpoint-version-2.1.0/offsets/1 | 0 .../state/0/0/1.delta | Bin .../state/0/0/2.delta | Bin .../state/0/1/1.delta | Bin .../state/0/1/2.delta | Bin .../state/0/2/1.delta | Bin .../state/0/2/2.delta | Bin .../state/0/3/1.delta | Bin .../state/0/3/2.delta | Bin .../state/0/4/1.delta | Bin .../state/0/4/2.delta | Bin .../state/0/5/1.delta | Bin .../state/0/5/2.delta | Bin .../state/0/6/1.delta | Bin .../state/0/6/2.delta | Bin .../state/0/7/1.delta | Bin .../state/0/7/2.delta | Bin .../state/0/8/1.delta | Bin .../state/0/8/2.delta | Bin .../state/0/9/1.delta | Bin .../state/0/9/2.delta | Bin .../commits/0 | 0 .../commits/1 | 0 .../metadata | 0 .../offsets/0 | 0 .../offsets/1 | 0 .../state/0/0/1.delta | Bin .../state/0/0/2.delta | Bin .../state/0/1/1.delta | Bin .../state/0/1/2.delta | Bin .../state/0/2/1.delta | Bin .../state/0/2/2.delta | Bin .../state/0/3/1.delta | Bin .../state/0/3/2.delta | Bin .../state/0/4/1.delta | Bin .../state/0/4/2.delta | Bin .../commits/0 | 0 .../commits/1 | 0 .../metadata | 0 .../offsets/0 | 0 .../offsets/1 | 0 .../commits/0 | 0 .../commits/1 | 0 .../metadata | 0 .../offsets/0 | 0 .../offsets/1 | 0 .../state/0/0/1.delta | Bin .../state/0/0/2.delta | Bin .../state/0/1/1.delta | Bin .../state/0/1/2.delta | Bin .../state/0/2/1.delta | Bin .../state/0/2/2.delta | Bin .../state/0/3/1.delta | Bin .../state/0/3/2.delta | Bin .../state/0/4/1.delta | Bin .../state/0/4/2.delta | Bin .../commits/0 | 0 .../commits/1 | 0 .../metadata | 0 .../offsets/0 | 0 .../offsets/1 | 0 .../state/0/0/1.delta | Bin .../state/0/0/2.delta | Bin .../state/0/1/1.delta | Bin .../state/0/1/2.delta | Bin .../state/0/2/1.delta | Bin .../state/0/2/2.delta | Bin .../state/0/3/1.delta | Bin .../state/0/3/2.delta | Bin .../state/0/4/1.delta | Bin .../state/0/4/2.delta | Bin .../commits/0 | 0 .../metadata | 0 .../offsets/0 | 0 .../state/0/0/left-keyToNumValues/1.delta | Bin .../0/0/left-keyWithIndexToValue/1.delta | Bin .../state/0/0/right-keyToNumValues/1.delta | Bin .../0/0/right-keyWithIndexToValue/1.delta | Bin .../state/0/1/left-keyToNumValues/1.delta | Bin .../0/1/left-keyWithIndexToValue/1.delta | Bin .../state/0/1/right-keyToNumValues/1.delta | Bin .../0/1/right-keyWithIndexToValue/1.delta | Bin .../state/0/2/left-keyToNumValues/1.delta | Bin .../0/2/left-keyWithIndexToValue/1.delta | Bin .../state/0/2/right-keyToNumValues/1.delta | Bin .../0/2/right-keyWithIndexToValue/1.delta | Bin .../state/0/3/left-keyToNumValues/1.delta | Bin .../0/3/left-keyWithIndexToValue/1.delta | Bin .../state/0/3/right-keyToNumValues/1.delta | Bin .../0/3/right-keyWithIndexToValue/1.delta | Bin .../state/0/4/left-keyToNumValues/1.delta | Bin .../0/4/left-keyWithIndexToValue/1.delta | Bin .../state/0/4/right-keyToNumValues/1.delta | Bin .../0/4/right-keyWithIndexToValue/1.delta | Bin .../chk%252520%252525@%252523chk/commits/0 | 0 .../chk%252520%252525@%252523chk/metadata | 0 .../chk%252520%252525@%252523chk/offsets/0 | 0 ...4201-8245-05f3dae4c372-c000.snappy.parquet | Bin .../output%20%25@%23output/_spark_metadata/0 | 0 .../file-sink-log-version-2.1.0/7.compact | 0 .../file-sink-log-version-2.1.0/8 | 0 .../file-sink-log-version-2.1.0/9 | 0 .../file-source-log-version-2.1.0/2.compact | 0 .../file-source-log-version-2.1.0/3 | 0 .../file-source-log-version-2.1.0/4 | 0 .../file-source-offset-version-2.1.0-json.txt | 0 .../file-source-offset-version-2.1.0-long.txt | 0 .../offset-log-version-2.1.0/0 | 0 .../query-event-logs-version-2.0.0.txt | 0 .../query-event-logs-version-2.0.1.txt | 0 .../query-event-logs-version-2.0.2.txt | 0 .../query-metadata-logs-version-2.1.0.txt | 0 .../resources/test-data/bad_after_good.csv | 0 .../before_1582_date_v2_4.snappy.orc | Bin .../before_1582_date_v2_4.snappy.parquet | Bin ...e_1582_timestamp_int96_v2_4.snappy.parquet | Bin ..._1582_timestamp_micros_v2_4.snappy.parquet | Bin ..._1582_timestamp_millis_v2_4.snappy.parquet | Bin .../test-data/before_1582_ts_v2_4.snappy.orc | Bin .../src/test/resources/test-data/bool.csv | 0 .../resources/test-data/cars-alternative.csv | 0 .../test-data/cars-blank-column-name.csv | 0 .../test/resources/test-data/cars-crlf.csv | 0 .../resources/test-data/cars-empty-value.csv | 0 .../resources/test-data/cars-malformed.csv | 0 .../test-data/cars-multichar-delim-crazy.csv | 0 .../test-data/cars-multichar-delim.csv | 0 .../test/resources/test-data/cars-null.csv | 0 .../test-data/cars-unbalanced-quotes.csv | 0 .../src/test/resources/test-data/cars.csv | 7 + .../src/test/resources/test-data/cars.tsv | 0 .../resources/test-data/cars_iso-8859-1.csv | 0 .../test-data/comments-whitespaces.csv | 0 .../src/test/resources/test-data/comments.csv | 0 .../src/test/resources/test-data/dates.csv | 0 .../test-data/dec-in-fixed-len.parquet | Bin .../resources/test-data/dec-in-i32.parquet | Bin .../resources/test-data/dec-in-i64.parquet | Bin .../src/test/resources/test-data/decimal.csv | 0 .../resources/test-data/disable_comments.csv | 0 .../src/test/resources/test-data/empty.csv | 0 .../resources/test-data/impala_timestamp.parq | Bin .../test/resources/test-data/malformedRow.csv | 0 .../test-data/native-splitter-output-all-null | Bin .../native-splitter-output-nullable-string | Bin .../test-data/nested-array-struct.parquet | Bin .../src/test/resources/test-data/numbers.csv | 0 .../test-data/old-repeated-int.parquet | Bin .../test-data/old-repeated-message.parquet | Bin .../resources/test-data/parquet-1217.parquet | Bin .../parquet-thrift-compat.snappy.parquet | Bin ...4fe9-87f2-770ef3551442-c000.snappy.parquet | Bin .../resources/test-data/postgresql/agg.data | 0 .../resources/test-data/postgresql/onek.data | 0 .../resources/test-data/postgresql/tenk.data | 0 .../test-data/proto-repeated-string.parquet | Bin .../test-data/proto-repeated-struct.parquet | Bin .../proto-struct-with-array-many.parquet | Bin .../test-data/proto-struct-with-array.parquet | Bin .../resources/test-data/simple_sparse.csv | 0 .../text-partitioned/year=2014/data.txt | 0 .../text-partitioned/year=2015/data.txt | 0 .../test/resources/test-data/text-suite.txt | 0 .../test/resources/test-data/text-suite2.txt | 0 .../test-data/timemillis-in-i64.parquet | Bin .../resources/test-data/unescaped-quotes.csv | 0 .../src/test/resources/test-data/utf16LE.json | Bin .../resources/test-data/utf16WithBOM.json | Bin .../resources/test-data/utf32BEWithBOM.json | Bin .../resources/test-data/value-malformed.csv | 0 .../test-data/with-array-fields.json | 0 .../resources/test-data/with-map-fields.json | 0 .../src/test/resources/tpcds-queries/q1.sql | 0 .../src/test/resources/tpcds-queries/q10.sql | 0 .../src/test/resources/tpcds-queries/q11.sql | 0 .../src/test/resources/tpcds-queries/q12.sql | 0 .../src/test/resources/tpcds-queries/q13.sql | 0 .../src/test/resources/tpcds-queries/q14a.sql | 0 .../src/test/resources/tpcds-queries/q14b.sql | 0 .../src/test/resources/tpcds-queries/q15.sql | 0 .../src/test/resources/tpcds-queries/q16.sql | 0 .../src/test/resources/tpcds-queries/q17.sql | 0 .../src/test/resources/tpcds-queries/q18.sql | 0 .../src/test/resources/tpcds-queries/q19.sql | 0 .../src/test/resources/tpcds-queries/q2.sql | 0 .../src/test/resources/tpcds-queries/q20.sql | 0 .../src/test/resources/tpcds-queries/q21.sql | 0 .../src/test/resources/tpcds-queries/q22.sql | 0 .../src/test/resources/tpcds-queries/q23a.sql | 0 .../src/test/resources/tpcds-queries/q23b.sql | 0 .../src/test/resources/tpcds-queries/q24a.sql | 0 .../src/test/resources/tpcds-queries/q24b.sql | 0 .../src/test/resources/tpcds-queries/q25.sql | 0 .../src/test/resources/tpcds-queries/q26.sql | 0 .../src/test/resources/tpcds-queries/q27.sql | 0 .../src/test/resources/tpcds-queries/q28.sql | 0 .../src/test/resources/tpcds-queries/q29.sql | 0 .../src/test/resources/tpcds-queries/q3.sql | 0 .../src/test/resources/tpcds-queries/q30.sql | 0 .../src/test/resources/tpcds-queries/q31.sql | 0 .../src/test/resources/tpcds-queries/q32.sql | 0 .../src/test/resources/tpcds-queries/q33.sql | 0 .../src/test/resources/tpcds-queries/q34.sql | 0 .../src/test/resources/tpcds-queries/q35.sql | 0 .../src/test/resources/tpcds-queries/q36.sql | 0 .../src/test/resources/tpcds-queries/q37.sql | 0 .../src/test/resources/tpcds-queries/q38.sql | 0 .../src/test/resources/tpcds-queries/q39a.sql | 0 .../src/test/resources/tpcds-queries/q39b.sql | 0 .../src/test/resources/tpcds-queries/q4.sql | 0 .../src/test/resources/tpcds-queries/q40.sql | 0 .../src/test/resources/tpcds-queries/q41.sql | 0 .../src/test/resources/tpcds-queries/q42.sql | 0 .../src/test/resources/tpcds-queries/q43.sql | 0 .../src/test/resources/tpcds-queries/q44.sql | 0 .../src/test/resources/tpcds-queries/q45.sql | 0 .../src/test/resources/tpcds-queries/q46.sql | 0 .../src/test/resources/tpcds-queries/q47.sql | 0 .../src/test/resources/tpcds-queries/q48.sql | 0 .../src/test/resources/tpcds-queries/q49.sql | 0 .../src/test/resources/tpcds-queries/q5.sql | 0 .../src/test/resources/tpcds-queries/q50.sql | 0 .../src/test/resources/tpcds-queries/q51.sql | 0 .../src/test/resources/tpcds-queries/q52.sql | 0 .../src/test/resources/tpcds-queries/q53.sql | 0 .../src/test/resources/tpcds-queries/q54.sql | 0 .../src/test/resources/tpcds-queries/q55.sql | 0 .../src/test/resources/tpcds-queries/q56.sql | 0 .../src/test/resources/tpcds-queries/q57.sql | 0 .../src/test/resources/tpcds-queries/q58.sql | 0 .../src/test/resources/tpcds-queries/q59.sql | 0 .../src/test/resources/tpcds-queries/q6.sql | 0 .../src/test/resources/tpcds-queries/q60.sql | 0 .../src/test/resources/tpcds-queries/q61.sql | 0 .../src/test/resources/tpcds-queries/q62.sql | 0 .../src/test/resources/tpcds-queries/q63.sql | 0 .../src/test/resources/tpcds-queries/q64.sql | 0 .../src/test/resources/tpcds-queries/q65.sql | 0 .../src/test/resources/tpcds-queries/q66.sql | 0 .../src/test/resources/tpcds-queries/q67.sql | 0 .../src/test/resources/tpcds-queries/q68.sql | 0 .../src/test/resources/tpcds-queries/q69.sql | 0 .../src/test/resources/tpcds-queries/q7.sql | 0 .../src/test/resources/tpcds-queries/q70.sql | 0 .../src/test/resources/tpcds-queries/q71.sql | 0 .../src/test/resources/tpcds-queries/q72.sql | 0 .../src/test/resources/tpcds-queries/q73.sql | 0 .../src/test/resources/tpcds-queries/q74.sql | 0 .../src/test/resources/tpcds-queries/q75.sql | 0 .../src/test/resources/tpcds-queries/q76.sql | 0 .../src/test/resources/tpcds-queries/q77.sql | 0 .../src/test/resources/tpcds-queries/q78.sql | 0 .../src/test/resources/tpcds-queries/q79.sql | 0 .../src/test/resources/tpcds-queries/q8.sql | 0 .../src/test/resources/tpcds-queries/q80.sql | 0 .../src/test/resources/tpcds-queries/q81.sql | 0 .../src/test/resources/tpcds-queries/q82.sql | 0 .../src/test/resources/tpcds-queries/q83.sql | 0 .../src/test/resources/tpcds-queries/q84.sql | 0 .../src/test/resources/tpcds-queries/q85.sql | 0 .../src/test/resources/tpcds-queries/q86.sql | 0 .../src/test/resources/tpcds-queries/q87.sql | 0 .../src/test/resources/tpcds-queries/q88.sql | 0 .../src/test/resources/tpcds-queries/q89.sql | 0 .../src/test/resources/tpcds-queries/q9.sql | 0 .../src/test/resources/tpcds-queries/q90.sql | 0 .../src/test/resources/tpcds-queries/q91.sql | 0 .../src/test/resources/tpcds-queries/q92.sql | 0 .../src/test/resources/tpcds-queries/q93.sql | 0 .../src/test/resources/tpcds-queries/q94.sql | 0 .../src/test/resources/tpcds-queries/q95.sql | 0 .../src/test/resources/tpcds-queries/q96.sql | 0 .../src/test/resources/tpcds-queries/q97.sql | 0 .../src/test/resources/tpcds-queries/q98.sql | 0 .../src/test/resources/tpcds-queries/q99.sql | 0 .../src/test/resources/tpch-queries/q1.sql | 0 .../src/test/resources/tpch-queries/q10.sql | 0 .../src/test/resources/tpch-queries/q11.sql | 0 .../src/test/resources/tpch-queries/q12.sql | 0 .../src/test/resources/tpch-queries/q13.sql | 0 .../src/test/resources/tpch-queries/q14.sql | 0 .../src/test/resources/tpch-queries/q15.sql | 0 .../src/test/resources/tpch-queries/q16.sql | 0 .../src/test/resources/tpch-queries/q17.sql | 0 .../src/test/resources/tpch-queries/q18.sql | 0 .../src/test/resources/tpch-queries/q19.sql | 0 .../src/test/resources/tpch-queries/q2.sql | 0 .../src/test/resources/tpch-queries/q20.sql | 0 .../src/test/resources/tpch-queries/q21.sql | 0 .../src/test/resources/tpch-queries/q22.sql | 0 .../src/test/resources/tpch-queries/q3.sql | 0 .../src/test/resources/tpch-queries/q4.sql | 0 .../src/test/resources/tpch-queries/q5.sql | 0 .../src/test/resources/tpch-queries/q6.sql | 0 .../src/test/resources/tpch-queries/q7.sql | 0 .../src/test/resources/tpch-queries/q8.sql | 0 .../src/test/resources/tpch-queries/q9.sql | 0 .../oap/tags/BroadcastHashJoinMode.scala | 0 .../intel/oap/tags/CommentOnContextPR.scala | 0 .../intel/oap/tags/SortMergeJoinMode.scala | 0 .../com/intel/oap/tags/TestAndWriteLogs.scala | 0 .../scala/com/intel/oap/tpc/TableGen.scala | 0 .../com/intel/oap/tpc/ds/TPCDSSuite.scala | 0 .../com/intel/oap/tpc/ds/TPCDSTableGen.scala | 0 .../intel/oap/tpc/h/GitHubActionEntries.scala | 0 .../scala/com/intel/oap/tpc/h/TPCHSuite.scala | 0 .../com/intel/oap/tpc/h/TPCHTableGen.scala | 0 .../com/intel/oap/tpc/util/TPCRunner.scala | 0 .../ArrowColumnarBatchSerializerSuite.scala | 0 .../shuffle/ColumnarShuffleWriterSuite.scala | 0 .../spark/sql/AggregateHashMapSuite.scala | 0 ...xCountDistinctForIntervalsQuerySuite.scala | 0 .../sql/ApproximatePercentileQuerySuite.scala | 0 .../apache/spark/sql/BenchmarkQueryTest.scala | 0 .../apache/spark/sql/CachedTableSuite.scala | 0 .../spark/sql/ColumnExpressionSuite.scala | 0 .../apache/spark/sql/ComplexTypesSuite.scala | 0 .../spark/sql/ConfigBehaviorSuite.scala | 0 .../sql/CountMinSketchAggQuerySuite.scala | 0 .../apache/spark/sql/CsvFunctionsSuite.scala | 0 .../spark/sql/DataFrameAggregateSuite.scala | 0 .../spark/sql/DataFrameComplexTypeSuite.scala | 0 .../spark/sql/DataFrameFunctionsSuite.scala | 0 .../apache/spark/sql/DataFrameHintSuite.scala | 0 .../spark/sql/DataFrameImplicitsSuite.scala | 0 .../apache/spark/sql/DataFrameJoinSuite.scala | 0 .../spark/sql/DataFrameNaFunctionsSuite.scala | 0 .../spark/sql/DataFramePivotSuite.scala | 0 .../spark/sql/DataFrameRangeSuite.scala | 0 .../spark/sql/DataFrameSelfJoinSuite.scala | 0 .../sql/DataFrameSetOperationsSuite.scala | 0 .../apache/spark/sql/DataFrameStatSuite.scala | 0 .../org/apache/spark/sql/DataFrameSuite.scala | 0 .../sql/DataFrameTimeWindowingSuite.scala | 0 .../spark/sql/DataFrameTungstenSuite.scala | 0 .../sql/DataFrameWindowFramesSuite.scala | 0 .../sql/DataFrameWindowFunctionsSuite.scala | 0 .../spark/sql/DataFrameWriterV2Suite.scala | 0 .../spark/sql/DatasetAggregatorSuite.scala | 0 .../apache/spark/sql/DatasetCacheSuite.scala | 0 .../spark/sql/DatasetOptimizationSuite.scala | 0 .../spark/sql/DatasetPrimitiveSuite.scala | 0 .../DatasetSerializerRegistratorSuite.scala | 0 .../org/apache/spark/sql/DatasetSuite.scala | 0 .../apache/spark/sql/DateFunctionsSuite.scala | 0 .../apache/spark/sql/DeprecatedAPISuite.scala | 0 .../DeprecatedDatasetAggregatorSuite.scala | 0 .../sql/DynamicPartitionPruningSuite.scala | 0 .../org/apache/spark/sql/ExplainSuite.scala | 0 .../spark/sql/ExpressionsSchemaSuite.scala | 0 .../spark/sql/ExtraStrategiesSuite.scala | 0 .../spark/sql/FileBasedDataSourceSuite.scala | 0 .../spark/sql/GeneratorFunctionSuite.scala | 0 .../spark/sql/IntegratedUDFTestUtils.scala | 0 .../org/apache/spark/sql/JoinHintSuite.scala | 0 .../org/apache/spark/sql/JoinSuite.scala | 0 .../apache/spark/sql/JsonFunctionsSuite.scala | 0 .../apache/spark/sql/LocalSparkSession.scala | 0 .../apache/spark/sql/MathFunctionsSuite.scala | 0 .../apache/spark/sql/MetadataCacheSuite.scala | 0 .../apache/spark/sql/MiscFunctionsSuite.scala | 0 .../spark/sql/ProcessingTimeSuite.scala | 0 .../org/apache/spark/sql/QueryTest.scala | 0 .../apache/spark/sql/RepartitionSuite.scala | 0 ...ullWithFalseInPredicateEndToEndSuite.scala | 0 .../scala/org/apache/spark/sql/RowSuite.scala | 0 .../apache/spark/sql/RuntimeConfigSuite.scala | 0 .../apache/spark/sql/SQLContextSuite.scala | 0 .../org/apache/spark/sql/SQLQuerySuite.scala | 0 .../apache/spark/sql/SQLQueryTestSuite.scala | 0 .../org/apache/spark/sql/SSBQuerySuite.scala | 0 .../sql/ScalaReflectionRelationSuite.scala | 0 .../apache/spark/sql/SerializationSuite.scala | 0 .../apache/spark/sql/SessionStateSuite.scala | 0 .../spark/sql/ShowCreateTableSuite.scala | 0 .../spark/sql/SparkSessionBuilderSuite.scala | 0 .../sql/SparkSessionExtensionSuite.scala | 0 .../spark/sql/StatisticsCollectionSuite.scala | 0 .../sql/StatisticsCollectionTestBase.scala | 0 .../spark/sql/StringFunctionsSuite.scala | 0 .../org/apache/spark/sql/SubquerySuite.scala | 0 .../apache/spark/sql/TPCDSQuerySuite.scala | 0 .../org/apache/spark/sql/TPCDSSchema.scala | 0 .../org/apache/spark/sql/TPCHQuerySuite.scala | 0 .../sql/TestQueryExecutionListener.scala | 0 .../sql/TypedImperativeAggregateSuite.scala | 0 .../scala/org/apache/spark/sql/UDFSuite.scala | 0 .../spark/sql/UDTRegistrationSuite.scala | 0 .../org/apache/spark/sql/UnsafeRowSuite.scala | 0 .../spark/sql/UserDefinedTypeSuite.scala | 0 .../spark/sql/XPathFunctionsSuite.scala | 0 .../spark/sql/connector/AlterTableTests.scala | 0 ...SourceV2DataFrameSessionCatalogSuite.scala | 0 .../DataSourceV2DataFrameSuite.scala | 0 .../DataSourceV2SQLSessionCatalogSuite.scala | 0 .../sql/connector/DataSourceV2SQLSuite.scala | 0 .../sql/connector/DataSourceV2Suite.scala | 0 .../connector/DataSourceV2UtilsSuite.scala | 0 .../FileDataSourceV2FallBackSuite.scala | 0 .../spark/sql/connector/InsertIntoTests.scala | 0 .../connector/SimpleWritableDataSource.scala | 0 .../SupportsCatalogOptionsSuite.scala | 0 .../connector/TableCapabilityCheckSuite.scala | 0 .../connector/TestV2SessionCatalogBase.scala | 0 .../sql/connector/V1ReadFallbackSuite.scala | 0 .../sql/connector/V1WriteFallbackSuite.scala | 0 .../V2CommandsCaseSensitivitySuite.scala | 0 .../AggregatingAccumulatorSuite.scala | 0 .../execution/BroadcastExchangeSuite.scala | 0 .../execution/CoGroupedIteratorSuite.scala | 0 .../CoalesceShufflePartitionsSuite.scala | 0 .../DataSourceScanExecRedactionSuite.scala | 0 .../DeprecatedWholeStageCodegenSuite.scala | 0 .../spark/sql/execution/ExchangeSuite.scala | 0 ...xternalAppendOnlyUnsafeRowArraySuite.scala | 0 .../sql/execution/GlobalTempViewSuite.scala | 0 .../sql/execution/GroupedIteratorSuite.scala | 0 .../spark/sql/execution/HiveResultSuite.scala | 0 .../LogicalPlanTagInSparkPlanSuite.scala | 0 .../OptimizeMetadataOnlyQuerySuite.scala | 0 .../spark/sql/execution/PlannerSuite.scala | 0 .../sql/execution/QueryExecutionSuite.scala | 0 .../QueryPlanningTrackerEndToEndSuite.scala | 0 .../spark/sql/execution/ReferenceSort.scala | 0 .../sql/execution/SQLExecutionSuite.scala | 0 .../sql/execution/SQLJsonProtocolSuite.scala | 0 .../spark/sql/execution/SQLViewSuite.scala | 0 .../execution/SQLWindowFunctionSuite.scala | 0 .../spark/sql/execution/SameResultSuite.scala | 0 .../ShufflePartitionsUtilSuite.scala | 0 .../spark/sql/execution/SortSuite.scala | 0 .../spark/sql/execution/SparkPlanSuite.scala | 0 .../spark/sql/execution/SparkPlanTest.scala | 0 .../sql/execution/SparkPlannerSuite.scala | 0 .../sql/execution/SparkSqlParserSuite.scala | 0 .../TakeOrderedAndProjectSuite.scala | 0 .../UnsafeFixedWidthAggregationMapSuite.scala | 0 .../UnsafeKVExternalSorterSuite.scala | 0 .../execution/UnsafeRowSerializerSuite.scala | 0 .../WholeStageCodegenSparkSubmitSuite.scala | 0 .../execution/WholeStageCodegenSuite.scala | 0 .../adaptive/AdaptiveQueryExecSuite.scala | 0 .../adaptive/AdaptiveTestUtils.scala | 0 .../ColumnarAdaptiveQueryExecSuite.scala | 0 .../SortBasedAggregationStoreSuite.scala | 0 .../arrow/ArrowConvertersSuite.scala | 0 .../execution/arrow/ArrowWriterSuite.scala | 0 .../execution/columnar/ColumnStatsSuite.scala | 0 .../execution/columnar/ColumnTypeSuite.scala | 0 .../columnar/ColumnarTestUtils.scala | 0 .../columnar/InMemoryColumnarQuerySuite.scala | 0 .../NullableColumnAccessorSuite.scala | 0 .../columnar/NullableColumnBuilderSuite.scala | 0 .../columnar/PartitionBatchPruningSuite.scala | 0 .../compression/BooleanBitSetSuite.scala | 0 .../compression/DictionaryEncodingSuite.scala | 0 .../compression/IntegralDeltaSuite.scala | 0 .../PassThroughEncodingSuite.scala | 0 .../compression/RunLengthEncodingSuite.scala | 0 .../TestCompressibleColumnBuilder.scala | 0 .../execution/command/CommandUtilsSuite.scala | 0 .../execution/command/DDLParserSuite.scala | 0 .../sql/execution/command/DDLSuite.scala | 0 .../command/PlanResolutionSuite.scala | 0 .../BasicWriteTaskStatsTrackerSuite.scala | 0 .../datasources/BucketingUtilsSuite.scala | 0 .../datasources/DataSourceStrategySuite.scala | 0 .../datasources/FileBasedDataSourceTest.scala | 0 .../datasources/FileFormatWriterSuite.scala | 0 .../datasources/FileIndexSuite.scala | 0 .../datasources/FileSourceStrategySuite.scala | 0 .../HadoopFileLinesReaderSuite.scala | 0 .../datasources/ReadNestedSchemaTest.scala | 0 .../datasources/ReadSchemaSuite.scala | 0 .../datasources/ReadSchemaTest.scala | 0 .../RowDataSourceStrategySuite.scala | 0 .../SaveIntoDataSourceCommandSuite.scala | 0 .../datasources/SchemaPruningSuite.scala | 0 .../binaryfile/BinaryFileFormatSuite.scala | 0 .../execution/datasources/csv/CSVSuite.scala | 0 .../datasources/csv/TestCsvData.scala | 0 .../datasources/jdbc/JdbcUtilsSuite.scala | 0 .../json/JsonParsingOptionsSuite.scala | 0 .../datasources/json/JsonSuite.scala | 0 .../datasources/json/TestJsonData.scala | 0 .../datasources/noop/NoopStreamSuite.scala | 0 .../datasources/noop/NoopSuite.scala | 0 .../orc/OrcColumnarBatchReaderSuite.scala | 0 .../orc/OrcPartitionDiscoverySuite.scala | 0 .../datasources/orc/OrcQuerySuite.scala | 0 .../datasources/orc/OrcSourceSuite.scala | 0 .../execution/datasources/orc/OrcTest.scala | 0 .../datasources/orc/OrcV1FilterSuite.scala | 0 .../orc/OrcV1SchemaPruningSuite.scala | 0 .../orc/OrcV2SchemaPruningSuite.scala | 0 .../ParquetAvroCompatibilitySuite.scala | 0 .../parquet/ParquetCommitterSuite.scala | 0 .../parquet/ParquetCompatibilityTest.scala | 0 ...rquetCompressionCodecPrecedenceSuite.scala | 0 .../parquet/ParquetEncodingSuite.scala | 0 .../parquet/ParquetFileFormatSuite.scala | 0 .../parquet/ParquetFilterSuite.scala | 0 .../datasources/parquet/ParquetIOSuite.scala | 0 .../ParquetInteroperabilitySuite.scala | 0 .../ParquetPartitionDiscoverySuite.scala | 0 .../ParquetProtobufCompatibilitySuite.scala | 0 .../parquet/ParquetQuerySuite.scala | 0 .../parquet/ParquetSchemaPruningSuite.scala | 0 .../parquet/ParquetSchemaSuite.scala | 0 .../datasources/parquet/ParquetTest.scala | 0 .../ParquetThriftCompatibilitySuite.scala | 0 .../datasources/text/TextSuite.scala | 0 .../datasources/text/WholeTextFileSuite.scala | 0 .../datasources/v2/FileTableSuite.scala | 0 .../v2/V2SessionCatalogSuite.scala | 0 .../sql/execution/debug/DebuggingSuite.scala | 0 .../history/SQLEventFilterBuilderSuite.scala | 0 .../SQLLiveEntitiesEventFilterSuite.scala | 0 .../execution/joins/BroadcastJoinSuite.scala | 0 .../execution/joins/ExistenceJoinSuite.scala | 0 .../execution/joins/HashedRelationSuite.scala | 0 .../sql/execution/joins/InnerJoinSuite.scala | 0 .../sql/execution/joins/OuterJoinSuite.scala | 0 .../execution/metric/SQLMetricsSuite.scala | 0 .../metric/SQLMetricsTestUtils.scala | 0 .../python/BatchEvalPythonExecSuite.scala | 0 .../python/ExtractPythonUDFsSuite.scala | 0 .../python/PythonForeachWriterSuite.scala | 0 .../sql/execution/python/PythonUDFSuite.scala | 0 .../sql/execution/python/RowQueueSuite.scala | 0 .../CheckpointFileManagerSuite.scala | 0 .../CompactibleFileStreamLogSuite.scala | 0 .../streaming/FileStreamSinkLogSuite.scala | 0 .../streaming/HDFSMetadataLogSuite.scala | 0 .../execution/streaming/MemorySinkSuite.scala | 0 .../streaming/MicroBatchExecutionSuite.scala | 0 .../streaming/OffsetSeqLogSuite.scala | 0 .../ProcessingTimeExecutorSuite.scala | 0 .../streaming/StreamMetadataSuite.scala | 0 .../shuffle/ContinuousShuffleSuite.scala | 0 .../sources/ConsoleWriteSupportSuite.scala | 0 .../sources/ForeachBatchSinkSuite.scala | 0 .../sources/ForeachWriterSuite.scala | 0 .../sources/RateStreamProviderSuite.scala | 0 .../sources/TextSocketStreamSuite.scala | 0 ...latMapGroupsWithStateExecHelperSuite.scala | 0 .../streaming/state/MemoryStateStore.scala | 0 .../state/StateStoreCoordinatorSuite.scala | 0 .../streaming/state/StateStoreRDDSuite.scala | 0 .../streaming/state/StateStoreSuite.scala | 0 ...treamingAggregationStateManagerSuite.scala | 0 .../SymmetricHashJoinStateManagerSuite.scala | 0 .../execution/ui/AllExecutionsPageSuite.scala | 0 .../ui/SQLAppStatusListenerSuite.scala | 0 .../vectorized/ArrowColumnVectorSuite.scala | 0 .../vectorized/ColumnVectorSuite.scala | 0 .../vectorized/ColumnarBatchSuite.scala | 0 .../sql/expressions/ExpressionInfoSuite.scala | 0 .../expressions/ReduceAggregatorSuite.scala | 0 .../spark/sql/internal/CatalogSuite.scala | 0 .../DeprecatedCreateExternalTableSuite.scala | 0 .../internal/ExecutorSideSQLConfSuite.scala | 0 .../sql/internal/SQLConfEntrySuite.scala | 0 .../sql/internal/SQLConfGetterSuite.scala | 0 .../spark/sql/internal/SQLConfSuite.scala | 0 .../spark/sql/internal/SharedStateSuite.scala | 0 .../internal/VariableSubstitutionSuite.scala | 0 .../org/apache/spark/sql/jdbc/JDBCSuite.scala | 0 .../spark/sql/jdbc/JDBCWriteSuite.scala | 0 .../spark/sql/sources/BucketedReadSuite.scala | 0 .../sql/sources/BucketedWriteSuite.scala | 0 .../sources/CreateTableAsSelectSuite.scala | 0 .../sql/sources/DDLSourceLoadSuite.scala | 0 .../sql/sources/DataSourceAnalysisSuite.scala | 0 .../spark/sql/sources/DataSourceTest.scala | 0 .../sources/ExternalCommandRunnerSuite.scala | 0 .../spark/sql/sources/FilteredScanSuite.scala | 0 .../spark/sql/sources/FiltersSuite.scala | 0 .../spark/sql/sources/InsertSuite.scala | 0 .../sql/sources/PartitionedWriteSuite.scala | 0 .../spark/sql/sources/PathOptionSuite.scala | 0 .../spark/sql/sources/PrunedScanSuite.scala | 0 .../sql/sources/ResolvedDataSourceSuite.scala | 0 .../spark/sql/sources/SaveLoadSuite.scala | 0 .../spark/sql/sources/TableScanSuite.scala | 0 .../sql/sources/fakeExternalSources.scala | 0 .../DeprecatedStreamingAggregationSuite.scala | 0 .../streaming/EventTimeWatermarkSuite.scala | 0 .../sql/streaming/FileStreamSinkSuite.scala | 0 .../sql/streaming/FileStreamSourceSuite.scala | 0 .../sql/streaming/FileStreamStressSuite.scala | 0 .../FlatMapGroupsWithStateSuite.scala | 0 .../streaming/MemorySourceStressSuite.scala | 0 .../spark/sql/streaming/OffsetSuite.scala | 0 .../sql/streaming/StateStoreMetricsTest.scala | 0 .../spark/sql/streaming/StreamSuite.scala | 0 .../spark/sql/streaming/StreamTest.scala | 0 .../streaming/StreamingAggregationSuite.scala | 0 .../StreamingDeduplicationSuite.scala | 0 .../sql/streaming/StreamingJoinSuite.scala | 0 .../StreamingQueryListenerSuite.scala | 0 .../StreamingQueryListenersConfSuite.scala | 0 .../StreamingQueryManagerSuite.scala | 0 ...StreamingQueryStatusAndProgressSuite.scala | 0 .../sql/streaming/StreamingQuerySuite.scala | 0 ...treamingSymmetricHashJoinHelperSuite.scala | 0 .../ContinuousAggregationSuite.scala | 0 ...ontinuousQueryStatusAndProgressSuite.scala | 0 .../ContinuousQueuedDataReaderSuite.scala | 0 .../continuous/ContinuousSuite.scala | 0 .../continuous/EpochCoordinatorSuite.scala | 0 .../sources/StreamingDataSourceV2Suite.scala | 0 .../test/DataStreamReaderWriterSuite.scala | 0 .../ui/StreamingQueryPageSuite.scala | 0 .../StreamingQueryStatusListenerSuite.scala | 0 .../sql/streaming/ui/UISeleniumSuite.scala | 0 .../spark/sql/streaming/ui/UIUtilsSuite.scala | 0 .../streaming/util/BlockOnStopSource.scala | 0 .../sql/streaming/util/BlockingSource.scala | 0 .../streaming/util/MockSourceProvider.scala | 0 .../streaming/util/StreamManualClock.scala | 0 .../sql/test/DataFrameReaderWriterSuite.scala | 0 .../spark/sql/test/GenericFlatSpecSuite.scala | 0 .../spark/sql/test/GenericFunSpecSuite.scala | 0 .../spark/sql/test/GenericWordSpecSuite.scala | 0 .../spark/sql/test/ProcessTestUtils.scala | 0 .../apache/spark/sql/test/SQLTestData.scala | 0 .../apache/spark/sql/test/SQLTestUtils.scala | 0 .../spark/sql/test/SharedSparkSession.scala | 0 .../spark/sql/test/TestSQLContext.scala | 0 .../sql/test/TestSparkSessionSuite.scala | 0 .../TravisDataFrameAggregateSuite.scala | 0 .../sql/travis/TravisDataFrameJoinSuite.scala | 0 .../sql/util/DataFrameCallbackSuite.scala | 0 .../util/ExecutionListenerManagerSuite.scala | 0 {cpp => native-sql-engine/cpp}/CMakeLists.txt | 0 {cpp => native-sql-engine/cpp}/compile.sh | 0 .../cpp}/src/CMakeLists.txt | 0 .../cpp}/src/benchmarks/CMakeLists.txt | 0 .../arrow_compute_benchmark_hash_aggregate.cc | 0 .../arrow_compute_benchmark_join.cc | 0 .../arrow_compute_benchmark_sort.cc | 0 .../arrow_compute_benchmark_wscg.cc | 0 .../src/benchmarks/shuffle_split_benchmark.cc | 0 .../codegen/arrow_compute/code_generator.h | 0 .../src/codegen/arrow_compute/expr_visitor.cc | 0 .../src/codegen/arrow_compute/expr_visitor.h | 0 .../codegen/arrow_compute/expr_visitor_impl.h | 0 .../arrow_compute/ext/action_codegen.h | 0 .../codegen/arrow_compute/ext/actions_impl.cc | 0 .../codegen/arrow_compute/ext/actions_impl.h | 0 .../arrow_compute/ext/array_appender.h | 0 .../arrow_compute/ext/array_item_index.h | 0 .../ext/basic_physical_kernels.cc | 0 .../codegen/arrow_compute/ext/cmp_function.h | 0 .../arrow_compute/ext/code_generator_base.h | 0 .../arrow_compute/ext/codegen_common.cc | 0 .../arrow_compute/ext/codegen_common.h | 0 .../arrow_compute/ext/codegen_context.h | 0 .../arrow_compute/ext/codegen_node_visitor.cc | 0 .../arrow_compute/ext/codegen_node_visitor.h | 0 .../arrow_compute/ext/codegen_register.cc | 0 .../arrow_compute/ext/codegen_register.h | 0 .../ext/conditioned_merge_join_kernel.cc | 0 .../ext/conditioned_probe_kernel.cc | 0 .../ext/expression_codegen_visitor.cc | 0 .../ext/expression_codegen_visitor.h | 0 .../ext/hash_aggregate_kernel.cc | 0 .../arrow_compute/ext/hash_relation_kernel.cc | 0 .../codegen/arrow_compute/ext/kernels_ext.cc | 0 .../codegen/arrow_compute/ext/kernels_ext.h | 0 .../arrow_compute/ext/merge_join_kernel.cc | 0 .../codegen/arrow_compute/ext/probe_kernel.cc | 0 .../codegen/arrow_compute/ext/sort_kernel.cc | 0 .../ext/typed_action_codegen_impl.h | 0 .../arrow_compute/ext/typed_node_visitor.cc | 0 .../arrow_compute/ext/typed_node_visitor.h | 0 .../ext/whole_stage_codegen_kernel.cc | 0 .../arrow_compute/ext/window_kernel.cc | 0 .../arrow_compute/ext/window_sort_kernel.h | 0 .../cpp}/src/codegen/code_generator.h | 0 .../cpp}/src/codegen/code_generator_factory.h | 0 .../cpp}/src/codegen/common/hash_relation.h | 0 .../src/codegen/common/hash_relation_number.h | 0 .../src/codegen/common/hash_relation_string.h | 0 .../cpp}/src/codegen/common/relation.cc | 0 .../cpp}/src/codegen/common/relation_column.h | 0 .../cpp}/src/codegen/common/result_iterator.h | 0 .../cpp}/src/codegen/common/sort_relation.h | 0 .../cpp}/src/codegen/common/visitor_base.h | 0 .../src/codegen/compute_ext/code_generator.h | 0 .../cpp}/src/codegen/expr_visitor.cc | 0 .../cpp}/src/codegen/expr_visitor.h | 0 .../cpp}/src/codegen/gandiva/code_generator.h | 0 .../cpp}/src/jni/concurrent_map.h | 0 .../cpp}/src/jni/jni_common.h | 0 .../cpp}/src/jni/jni_wrapper.cc | 0 .../cpp}/src/precompile/array.cc | 0 .../cpp}/src/precompile/array.h | 0 .../cpp}/src/precompile/builder.cc | 0 .../cpp}/src/precompile/builder.h | 0 .../cpp}/src/precompile/gandiva.h | 0 .../cpp}/src/precompile/gandiva_projector.cc | 0 .../cpp}/src/precompile/gandiva_projector.h | 0 .../cpp}/src/precompile/hash_arrays_kernel.cc | 0 .../cpp}/src/precompile/hash_arrays_kernel.h | 0 .../cpp}/src/precompile/hash_map.cc | 0 .../cpp}/src/precompile/hash_map.h | 0 .../cpp}/src/precompile/sort.cc | 0 .../cpp}/src/precompile/sort.h | 0 .../cpp}/src/precompile/sparse_hash_map.cc | 0 .../cpp}/src/precompile/sparse_hash_map.h | 0 .../cpp}/src/precompile/type.cc | 0 .../cpp}/src/precompile/type.h | 0 .../cpp}/src/precompile/type_traits.h | 0 .../cpp}/src/precompile/unsafe_array.cc | 0 .../cpp}/src/precompile/unsafe_array.h | 0 .../cpp}/src/precompile/vector.cc | 0 .../cpp}/src/precompile/vector.h | 0 .../cpp}/src/proto/Exprs.proto | 0 .../cpp}/src/proto/protobuf_utils.cc | 0 .../cpp}/src/proto/protobuf_utils.h | 0 .../cpp}/src/resources/libhdfs.so | Bin .../cpp}/src/resources/libhdfs3.so | Bin .../cpp}/src/resources/libprotobuf.so.13 | Bin .../cpp}/src/shuffle/splitter.cc | 0 .../cpp}/src/shuffle/splitter.h | 0 .../cpp}/src/shuffle/type.h | 0 .../cpp}/src/shuffle/utils.h | 0 .../cpp}/src/tests/CMakeLists.txt | 0 .../src/tests/arrow_compute_test_aggregate.cc | 0 .../arrow_compute_test_aggregate_decimal.cc | 0 .../arrow_compute_test_check_condition.cc | 0 .../src/tests/arrow_compute_test_join_smj.cc | 0 .../src/tests/arrow_compute_test_join_wocg.cc | 0 .../tests/arrow_compute_test_precompile.cc | 0 .../cpp}/src/tests/arrow_compute_test_sort.cc | 0 .../src/tests/arrow_compute_test_window.cc | 0 .../cpp}/src/tests/arrow_compute_test_wscg.cc | 0 .../cpp}/src/tests/shuffle_split_test.cc | 0 .../cpp}/src/tests/test_utils.h | 0 .../src/third_party/arrow/utils/hashing.h | 0 .../arrow/vendored/xxhash/README.md | 0 .../third_party/arrow/vendored/xxhash/xxh3.h | 0 .../arrow/vendored/xxhash/xxhash.c | 0 .../arrow/vendored/xxhash/xxhash.h | 0 .../cpp}/src/third_party/datetime/README.md | 0 .../cpp}/src/third_party/datetime/date.h | 0 .../src/third_party/gandiva/CMakeLists.txt | 0 .../src/third_party/gandiva/decimal_ops.cc | 0 .../src/third_party/gandiva/decimal_ops.h | 0 .../third_party/gandiva/epoch_time_point.h | 0 .../cpp}/src/third_party/gandiva/time.cc | 0 .../src/third_party/gandiva/time_constants.h | 0 .../src/third_party/gandiva/time_fields.h | 0 .../cpp}/src/third_party/gandiva/types.h | 0 .../src/third_party/murmurhash/murmurhash32.h | 0 .../src/third_party/murmurhash/murmurhash64.h | 0 .../src/third_party/row_wise_memory/hashMap.h | 0 .../row_wise_memory/native_memory.h | 0 .../third_party/row_wise_memory/unsafe_row.h | 0 .../cpp}/src/third_party/ska_sort.hpp | 0 .../src/third_party/sparsehash/dense_hash_map | 0 .../src/third_party/sparsehash/dense_hash_set | 0 .../sparsehash/internal/densehashtable.h | 0 .../sparsehash/internal/hashtable-common.h | 0 .../internal/libc_allocator_with_realloc.h | 0 .../sparsehash/internal/sparsehashtable.h | 0 .../third_party/sparsehash/sparse_hash_map | 0 .../third_party/sparsehash/sparse_hash_map.h | 0 .../third_party/sparsehash/sparse_hash_set | 0 .../src/third_party/sparsehash/sparsetable | 0 .../cpp}/src/third_party/sparsehash/traits | 0 .../cpp}/src/third_party/timsort.hpp | 0 .../cpp}/src/utils/macros.h | 0 .../gitdiff_AdaptiveSparkPlanExec.patch | 0 {tools => native-sql-engine/tools}/process.py | 0 {tools => native-sql-engine/tools}/run_ut.sh | 0 pom.xml | 40 ++ scalastyle-config.xml | 386 ++++++++++++++ 955 files changed, 4351 insertions(+), 58 deletions(-) delete mode 100644 .clang-format delete mode 100644 .gitmodules create mode 100644 arrow-data-source/.github/PULL_REQUEST_TEMPLATE create mode 100644 arrow-data-source/.github/workflows/dev_cron.yml create mode 100644 arrow-data-source/.github/workflows/dev_cron/issues_link.js create mode 100644 arrow-data-source/.github/workflows/dev_cron/title_check.js create mode 100644 arrow-data-source/.github/workflows/dev_cron/title_check.md create mode 100644 arrow-data-source/.github/workflows/report_ram_log.yml create mode 100644 arrow-data-source/.github/workflows/tpch.yml create mode 100644 arrow-data-source/.github/workflows/unittests.yml rename .travis.yml => arrow-data-source/.travis.yml (100%) rename CHANGELOG.md => arrow-data-source/CHANGELOG.md (100%) rename LICENSE.txt => arrow-data-source/LICENSE.txt (100%) create mode 100644 arrow-data-source/README.md create mode 100644 arrow-data-source/common/pom.xml create mode 100644 arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/NativeSQLMemoryConsumer.java create mode 100644 arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/NativeSQLMemoryMetrics.java create mode 100644 arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/SparkManagedAllocationListener.java create mode 100644 arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/SparkManagedReservationListener.java create mode 100644 arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/Spiller.java rename {core => arrow-data-source/common}/src/main/java/com/intel/oap/vectorized/ArrowWritableColumnVector.java (99%) create mode 100644 arrow-data-source/common/src/main/scala/org/apache/spark/sql/execution/datasources/v2/arrow/SparkMemoryUtils.scala create mode 100644 arrow-data-source/common/src/main/scala/org/apache/spark/sql/execution/datasources/v2/arrow/SparkSchemaUtils.scala rename {docs => arrow-data-source/docs}/ApacheArrowInstallation.md (100%) rename {docs => arrow-data-source/docs}/Configuration.md (100%) rename {docs => arrow-data-source/docs}/Installation.md (100%) rename {docs => arrow-data-source/docs}/InstallationNotes.md (100%) rename {docs => arrow-data-source/docs}/OAP-Developer-Guide.md (100%) rename {docs => arrow-data-source/docs}/OAP-Installation-Guide.md (100%) rename {docs => arrow-data-source/docs}/Prerequisite.md (100%) rename {docs => arrow-data-source/docs}/SparkInstallation.md (100%) rename {docs => arrow-data-source/docs}/User-Guide.md (100%) create mode 100644 arrow-data-source/docs/image/arrowdatasource_validation.png rename {docs => arrow-data-source/docs}/image/columnar.png (100%) rename {docs => arrow-data-source/docs}/image/core_arch.jpg (100%) rename {docs => arrow-data-source/docs}/image/dataset.png (100%) rename {docs => arrow-data-source/docs}/image/decision_support_bench1_result_by_query.png (100%) rename {docs => arrow-data-source/docs}/image/decision_support_bench1_result_in_total.png (100%) rename {docs => arrow-data-source/docs}/image/decision_support_bench2_result_by_query.png (100%) rename {docs => arrow-data-source/docs}/image/decision_support_bench2_result_in_total.png (100%) rename {docs => arrow-data-source/docs}/image/kernel.png (100%) rename {docs => arrow-data-source/docs}/image/nativesql_arch.png (100%) rename {docs => arrow-data-source/docs}/image/performance.png (100%) rename {docs => arrow-data-source/docs}/image/shuffle.png (100%) rename {docs => arrow-data-source/docs}/index.md (100%) create mode 100644 arrow-data-source/mkdocs.yml create mode 100644 arrow-data-source/parquet/pom.xml create mode 100644 arrow-data-source/parquet/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/parquet/ServiceLoaderUtil.scala create mode 100644 arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormat.scala create mode 100644 arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatIndicator.scala create mode 100644 arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSQLConf.scala create mode 100644 arrow-data-source/parquet/src/test/scala/com/intel/oap/spark/sql/execution/datasources/v2/parquet/ParquetFileFormatTest.scala create mode 100644 arrow-data-source/pom.xml create mode 100644 arrow-data-source/resource/arrowdatasource_validation.png create mode 100644 arrow-data-source/standard/pom.xml create mode 100644 arrow-data-source/standard/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/DataFrameReaderImplicits.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowFileFormat.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowDataSourceV2.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowFilters.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowOptions.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowPartitionReaderFactory.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowSQLConf.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowScan.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowScanBuilder.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowTable.scala create mode 100644 arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowUtils.scala rename {core/src/test/resources/test-data => arrow-data-source/standard/src/test/resources}/cars.csv (100%) create mode 100644 arrow-data-source/standard/src/test/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowDataSourceTPCHBasedTest.scala create mode 100644 arrow-data-source/standard/src/test/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowDataSourceTest.scala delete mode 100644 cpp/.gitignore delete mode 160000 dep/arrow-data-source rename {core => native-sql-engine/core}/pom.xml (98%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/datasource/VectorizedParquetArrowReader.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/datasource/parquet/ParquetReader.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/datasource/parquet/ParquetReaderJniWrapper.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/datasource/parquet/ParquetWriter.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/datasource/parquet/ParquetWriterJniWrapper.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/expression/ArrowColumnarBatch.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/expression/ColumnarArithmeticWithGandiva.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/AdaptorReferenceManager.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ArrowBufBuilder.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ArrowCompressedStreamReader.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ArrowFieldNodeBuilder.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilder.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilderImpl.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/BatchIterator.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/CompressedVectorLoader.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ExpressionEvaluator.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ExpressionEvaluatorJniWrapper.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/JniUtils.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/MetricsObject.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/NativePartitioning.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/NativeSerializableObject.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/PartitionFileInfo.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/SerializableObject.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ShuffleDecompressionJniWrapper.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/ShuffleSplitterJniWrapper.java (100%) rename {core => native-sql-engine/core}/src/main/java/com/intel/oap/vectorized/SplitResult.java (100%) rename {core => native-sql-engine/core}/src/main/java/test (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/ColumnarGuardRule.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/ColumnarPlugin.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/ColumnarPluginConfig.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/BroadcastColumnarRDD.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/CoalesceBatchesExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarBasicPhysicalOperators.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarBatchScanExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarBroadcastHashJoinExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarDataSourceRDD.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarExpandExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarHashAggregateExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarShuffledHashJoinExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarSortExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarSortMergeJoinExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarWholeStageCodegenExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/ColumnarWindowExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/DataToArrowColumnarExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/execution/RowToArrowColumnarExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/CodeGeneration.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarArithmetic.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarBinaryOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarBoundAttribute.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarCaseWhenOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarCoalesceOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarConcatOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarConditionProjector.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarConditionedProbeJoin.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarExpression.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarFilter.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarHashAggregation.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarIfOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarInOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarInSetOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarLiterals.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarNamedExpressions.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarProjection.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarRoundOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarSortMergeJoin.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarSorter.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarSubquery.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ColumnarUnaryOperator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/expression/ConverterUtils.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializer.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/com/intel/oap/vectorized/CloseableColumnBatchIterator.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleDependency.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleWriter.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/shuffle/sort/ColumnarShuffleManager.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/ColumnarCollapseCodegenStages.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/ColumnarExchange.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/ColumnarHashedRelation.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/adaptive/ColumnarCustomShuffleReaderExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/adaptive/QueryStageExec.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/execution/datasources/v2/VectorizedFilePartitionReaderHandler.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/util/ArrowUtils.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/util/OASPackageBridge.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/sql/util/StructTypeFWD.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/util/ExecutorManager.scala (100%) rename {core => native-sql-engine/core}/src/main/scala/org/apache/spark/util/UserAddedJarUtils.scala (100%) rename {core => native-sql-engine/core}/src/test/java/com/intel/oap/datasource/parquet/ParquetReadTest.java (100%) rename {core => native-sql-engine/core}/src/test/java/com/intel/oap/datasource/parquet/ParquetReadWriteTest.java (100%) rename {core => native-sql-engine/core}/src/test/java/com/intel/oap/datasource/parquet/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet (100%) rename {core => native-sql-engine/core}/src/test/java/com/intel/oap/tpc/MallocUtils.java (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/metadata (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/metadata (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/metadata (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/metadata (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/metadata (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/1 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/2.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/commits/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/metadata (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/offsets/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyToNumValues/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyWithIndexToValue/1.delta (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/commits/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/metadata (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/offsets/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/escaped-path-2.4.0/output %@#output/part-00000-97f675a2-bb82-4201-8245-05f3dae4c372-c000.snappy.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/escaped-path-2.4.0/output%20%25@%23output/_spark_metadata/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/7.compact (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/8 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/9 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/file-source-log-version-2.1.0/2.compact (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/file-source-log-version-2.1.0/3 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/file-source-log-version-2.1.0/4 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-json.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-long.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/offset-log-version-2.1.0/0 (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/query-event-logs-version-2.0.0.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/query-event-logs-version-2.0.1.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/query-event-logs-version-2.0.2.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/structured-streaming/query-metadata-logs-version-2.1.0.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/bad_after_good.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/before_1582_date_v2_4.snappy.orc (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/before_1582_date_v2_4.snappy.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/before_1582_timestamp_int96_v2_4.snappy.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/before_1582_timestamp_micros_v2_4.snappy.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/before_1582_timestamp_millis_v2_4.snappy.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/before_1582_ts_v2_4.snappy.orc (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/bool.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-alternative.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-blank-column-name.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-crlf.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-empty-value.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-malformed.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-multichar-delim-crazy.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-multichar-delim.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-null.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars-unbalanced-quotes.csv (100%) create mode 100644 native-sql-engine/core/src/test/resources/test-data/cars.csv rename {core => native-sql-engine/core}/src/test/resources/test-data/cars.tsv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/cars_iso-8859-1.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/comments-whitespaces.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/comments.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/dates.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/dec-in-fixed-len.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/dec-in-i32.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/dec-in-i64.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/decimal.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/disable_comments.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/empty.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/impala_timestamp.parq (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/malformedRow.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/native-splitter-output-all-null (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/native-splitter-output-nullable-string (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/nested-array-struct.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/numbers.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/old-repeated-int.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/old-repeated-message.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/parquet-1217.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/parquet-thrift-compat.snappy.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/postgresql/agg.data (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/postgresql/onek.data (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/postgresql/tenk.data (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/proto-repeated-string.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/proto-repeated-struct.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/proto-struct-with-array-many.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/proto-struct-with-array.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/simple_sparse.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/text-partitioned/year=2014/data.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/text-partitioned/year=2015/data.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/text-suite.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/text-suite2.txt (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/timemillis-in-i64.parquet (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/unescaped-quotes.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/utf16LE.json (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/utf16WithBOM.json (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/utf32BEWithBOM.json (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/value-malformed.csv (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/with-array-fields.json (100%) rename {core => native-sql-engine/core}/src/test/resources/test-data/with-map-fields.json (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q1.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q10.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q11.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q12.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q13.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q14a.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q14b.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q15.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q16.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q17.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q18.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q19.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q2.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q20.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q21.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q22.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q23a.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q23b.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q24a.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q24b.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q25.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q26.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q27.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q28.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q29.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q3.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q30.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q31.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q32.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q33.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q34.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q35.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q36.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q37.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q38.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q39a.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q39b.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q4.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q40.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q41.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q42.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q43.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q44.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q45.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q46.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q47.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q48.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q49.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q5.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q50.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q51.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q52.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q53.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q54.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q55.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q56.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q57.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q58.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q59.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q6.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q60.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q61.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q62.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q63.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q64.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q65.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q66.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q67.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q68.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q69.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q7.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q70.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q71.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q72.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q73.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q74.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q75.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q76.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q77.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q78.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q79.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q8.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q80.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q81.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q82.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q83.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q84.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q85.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q86.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q87.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q88.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q89.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q9.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q90.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q91.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q92.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q93.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q94.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q95.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q96.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q97.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q98.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpcds-queries/q99.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q1.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q10.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q11.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q12.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q13.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q14.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q15.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q16.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q17.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q18.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q19.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q2.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q20.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q21.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q22.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q3.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q4.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q5.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q6.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q7.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q8.sql (100%) rename {core => native-sql-engine/core}/src/test/resources/tpch-queries/q9.sql (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tags/BroadcastHashJoinMode.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tags/CommentOnContextPR.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tags/SortMergeJoinMode.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tags/TestAndWriteLogs.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tpc/TableGen.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tpc/ds/TPCDSSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tpc/ds/TPCDSTableGen.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tpc/h/GitHubActionEntries.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tpc/h/TPCHSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tpc/h/TPCHTableGen.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/tpc/util/TPCRunner.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/shuffle/ColumnarShuffleWriterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/AggregateHashMapSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ApproxCountDistinctForIntervalsQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ApproximatePercentileQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/BenchmarkQueryTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/CachedTableSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ComplexTypesSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ConfigBehaviorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/CountMinSketchAggQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/CsvFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameComplexTypeSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameHintSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameImplicitsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameJoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameNaFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameRangeSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameSelfJoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameSetOperationsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameStatSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameTimeWindowingSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameTungstenSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameWindowFramesSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameWindowFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DataFrameWriterV2Suite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DatasetAggregatorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DatasetCacheSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DatasetOptimizationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DatasetPrimitiveSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DatasetSerializerRegistratorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DatasetSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DeprecatedAPISuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DeprecatedDatasetAggregatorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/DynamicPartitionPruningSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ExplainSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ExpressionsSchemaSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ExtraStrategiesSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/FileBasedDataSourceSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/GeneratorFunctionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/IntegratedUDFTestUtils.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/JoinHintSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/JoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/JsonFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/LocalSparkSession.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/MathFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/MetadataCacheSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/MiscFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ProcessingTimeSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/QueryTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/RepartitionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ReplaceNullWithFalseInPredicateEndToEndSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/RowSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/RuntimeConfigSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SQLContextSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SQLQueryTestSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SSBQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ScalaReflectionRelationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SerializationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SessionStateSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/ShowCreateTableSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SparkSessionBuilderSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SparkSessionExtensionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/StatisticsCollectionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/StatisticsCollectionTestBase.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/SubquerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/TPCDSQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/TPCDSSchema.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/TPCHQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/TestQueryExecutionListener.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/TypedImperativeAggregateSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/UDFSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/UDTRegistrationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/XPathFunctionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSessionCatalogSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSessionCatalogSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/DataSourceV2Suite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/DataSourceV2UtilsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/FileDataSourceV2FallBackSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/InsertIntoTests.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/SimpleWritableDataSource.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/SupportsCatalogOptionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/TableCapabilityCheckSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/TestV2SessionCatalogBase.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/V1ReadFallbackSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/V1WriteFallbackSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/connector/V2CommandsCaseSensitivitySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/AggregatingAccumulatorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/BroadcastExchangeSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/CoGroupedIteratorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/CoalesceShufflePartitionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/DataSourceScanExecRedactionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/DeprecatedWholeStageCodegenSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/ExchangeSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/ExternalAppendOnlyUnsafeRowArraySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/GlobalTempViewSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/GroupedIteratorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/HiveResultSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/LogicalPlanTagInSparkPlanSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/PlannerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/QueryExecutionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/QueryPlanningTrackerEndToEndSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/ReferenceSort.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SQLExecutionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SQLJsonProtocolSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SQLViewSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SQLWindowFunctionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SameResultSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/ShufflePartitionsUtilSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SortSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SparkPlanSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SparkPlanTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SparkPlannerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/TakeOrderedAndProjectSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/UnsafeKVExternalSorterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/UnsafeRowSerializerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSparkSubmitSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveQueryExecSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveTestUtils.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/adaptive/ColumnarAdaptiveQueryExecSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/aggregate/SortBasedAggregationStoreSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowConvertersSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowWriterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnStatsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnTypeSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnarTestUtils.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/InMemoryColumnarQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnAccessorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnBuilderSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/PartitionBatchPruningSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/compression/BooleanBitSetSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/compression/DictionaryEncodingSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/compression/IntegralDeltaSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/compression/PassThroughEncodingSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/compression/RunLengthEncodingSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/columnar/compression/TestCompressibleColumnBuilder.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/command/CommandUtilsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/command/DDLParserSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/command/DDLSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/command/PlanResolutionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/BasicWriteTaskStatsTrackerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/BucketingUtilsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/DataSourceStrategySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/FileBasedDataSourceTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/FileFormatWriterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/FileIndexSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/FileSourceStrategySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/HadoopFileLinesReaderSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/ReadNestedSchemaTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/RowDataSourceStrategySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/SaveIntoDataSourceCommandSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/SchemaPruningSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/binaryfile/BinaryFileFormatSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/csv/CSVSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/csv/TestCsvData.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/jdbc/JdbcUtilsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonParsingOptionsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/json/TestJsonData.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopStreamSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcColumnarBatchReaderSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcPartitionDiscoverySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcSourceSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1FilterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1SchemaPruningSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV2SchemaPruningSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetAvroCompatibilitySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCommitterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompatibilityTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompressionCodecPrecedenceSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetEncodingSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetIOSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetInteroperabilitySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetPartitionDiscoverySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetProtobufCompatibilitySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaPruningSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetThriftCompatibilitySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/text/TextSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/text/WholeTextFileSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/v2/FileTableSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/datasources/v2/V2SessionCatalogSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/debug/DebuggingSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/history/SQLEventFilterBuilderSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/history/SQLLiveEntitiesEventFilterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/joins/BroadcastJoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/joins/ExistenceJoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/joins/HashedRelationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/joins/InnerJoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/joins/OuterJoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsTestUtils.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/python/BatchEvalPythonExecSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/python/ExtractPythonUDFsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/python/PythonForeachWriterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/python/PythonUDFSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/python/RowQueueSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/CheckpointFileManagerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/CompactibleFileStreamLogSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/FileStreamSinkLogSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/HDFSMetadataLogSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/MemorySinkSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/MicroBatchExecutionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/OffsetSeqLogSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/ProcessingTimeExecutorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/StreamMetadataSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/continuous/shuffle/ContinuousShuffleSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ConsoleWriteSupportSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachBatchSinkSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachWriterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/sources/RateStreamProviderSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/sources/TextSocketStreamSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/state/FlatMapGroupsWithStateExecHelperSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/state/MemoryStateStore.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreCoordinatorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreRDDSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/state/StreamingAggregationStateManagerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/streaming/state/SymmetricHashJoinStateManagerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/ui/AllExecutionsPageSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/ui/SQLAppStatusListenerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/vectorized/ArrowColumnVectorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnVectorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnarBatchSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/expressions/ExpressionInfoSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/expressions/ReduceAggregatorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/internal/DeprecatedCreateExternalTableSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/internal/ExecutorSideSQLConfSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/internal/SQLConfEntrySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/internal/SQLConfGetterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/internal/SQLConfSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/internal/SharedStateSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/internal/VariableSubstitutionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/jdbc/JDBCWriteSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/BucketedReadSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/BucketedWriteSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/CreateTableAsSelectSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/DDLSourceLoadSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/DataSourceAnalysisSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/DataSourceTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/ExternalCommandRunnerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/FilteredScanSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/FiltersSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/InsertSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/PartitionedWriteSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/PathOptionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/PrunedScanSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/ResolvedDataSourceSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/SaveLoadSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/TableScanSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/sources/fakeExternalSources.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/DeprecatedStreamingAggregationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/EventTimeWatermarkSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/FileStreamSinkSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/FileStreamSourceSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/FileStreamStressSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/FlatMapGroupsWithStateSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/MemorySourceStressSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/OffsetSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StateStoreMetricsTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamTest.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingAggregationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingDeduplicationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingJoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenersConfSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryManagerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryStatusAndProgressSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingQuerySuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/StreamingSymmetricHashJoinHelperSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousAggregationSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueryStatusAndProgressSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueuedDataReaderSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/continuous/EpochCoordinatorSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/sources/StreamingDataSourceV2Suite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/test/DataStreamReaderWriterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryPageSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryStatusListenerSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/ui/UISeleniumSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/ui/UIUtilsSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/util/BlockOnStopSource.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/util/BlockingSource.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/util/MockSourceProvider.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/streaming/util/StreamManualClock.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/GenericFlatSpecSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/GenericFunSpecSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/GenericWordSpecSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/ProcessTestUtils.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/SQLTestData.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/TestSQLContext.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/test/TestSparkSessionSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameAggregateSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameJoinSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/util/DataFrameCallbackSuite.scala (100%) rename {core => native-sql-engine/core}/src/test/scala/org/apache/spark/sql/util/ExecutionListenerManagerSuite.scala (100%) rename {cpp => native-sql-engine/cpp}/CMakeLists.txt (100%) rename {cpp => native-sql-engine/cpp}/compile.sh (100%) rename {cpp => native-sql-engine/cpp}/src/CMakeLists.txt (100%) rename {cpp => native-sql-engine/cpp}/src/benchmarks/CMakeLists.txt (100%) rename {cpp => native-sql-engine/cpp}/src/benchmarks/arrow_compute_benchmark_hash_aggregate.cc (100%) rename {cpp => native-sql-engine/cpp}/src/benchmarks/arrow_compute_benchmark_join.cc (100%) rename {cpp => native-sql-engine/cpp}/src/benchmarks/arrow_compute_benchmark_sort.cc (100%) rename {cpp => native-sql-engine/cpp}/src/benchmarks/arrow_compute_benchmark_wscg.cc (100%) rename {cpp => native-sql-engine/cpp}/src/benchmarks/shuffle_split_benchmark.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/code_generator.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/expr_visitor.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/expr_visitor.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/expr_visitor_impl.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/action_codegen.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/actions_impl.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/actions_impl.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/array_appender.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/array_item_index.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/basic_physical_kernels.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/cmp_function.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/code_generator_base.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/codegen_common.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/codegen_common.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/codegen_context.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/codegen_node_visitor.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/codegen_node_visitor.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/codegen_register.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/codegen_register.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/conditioned_merge_join_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/conditioned_probe_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/expression_codegen_visitor.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/expression_codegen_visitor.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/hash_aggregate_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/hash_relation_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/kernels_ext.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/kernels_ext.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/merge_join_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/probe_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/sort_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/typed_action_codegen_impl.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/typed_node_visitor.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/typed_node_visitor.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/whole_stage_codegen_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/window_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/arrow_compute/ext/window_sort_kernel.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/code_generator.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/code_generator_factory.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/common/hash_relation.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/common/hash_relation_number.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/common/hash_relation_string.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/common/relation.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/common/relation_column.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/common/result_iterator.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/common/sort_relation.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/common/visitor_base.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/compute_ext/code_generator.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/expr_visitor.cc (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/expr_visitor.h (100%) rename {cpp => native-sql-engine/cpp}/src/codegen/gandiva/code_generator.h (100%) rename {cpp => native-sql-engine/cpp}/src/jni/concurrent_map.h (100%) rename {cpp => native-sql-engine/cpp}/src/jni/jni_common.h (100%) rename {cpp => native-sql-engine/cpp}/src/jni/jni_wrapper.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/array.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/array.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/builder.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/builder.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/gandiva.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/gandiva_projector.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/gandiva_projector.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/hash_arrays_kernel.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/hash_arrays_kernel.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/hash_map.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/hash_map.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/sort.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/sort.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/sparse_hash_map.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/sparse_hash_map.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/type.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/type.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/type_traits.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/unsafe_array.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/unsafe_array.h (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/vector.cc (100%) rename {cpp => native-sql-engine/cpp}/src/precompile/vector.h (100%) rename {cpp => native-sql-engine/cpp}/src/proto/Exprs.proto (100%) rename {cpp => native-sql-engine/cpp}/src/proto/protobuf_utils.cc (100%) rename {cpp => native-sql-engine/cpp}/src/proto/protobuf_utils.h (100%) rename {cpp => native-sql-engine/cpp}/src/resources/libhdfs.so (100%) rename {cpp => native-sql-engine/cpp}/src/resources/libhdfs3.so (100%) rename {cpp => native-sql-engine/cpp}/src/resources/libprotobuf.so.13 (100%) rename {cpp => native-sql-engine/cpp}/src/shuffle/splitter.cc (100%) rename {cpp => native-sql-engine/cpp}/src/shuffle/splitter.h (100%) rename {cpp => native-sql-engine/cpp}/src/shuffle/type.h (100%) rename {cpp => native-sql-engine/cpp}/src/shuffle/utils.h (100%) rename {cpp => native-sql-engine/cpp}/src/tests/CMakeLists.txt (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_aggregate.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_aggregate_decimal.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_check_condition.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_join_smj.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_join_wocg.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_precompile.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_sort.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_window.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/arrow_compute_test_wscg.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/shuffle_split_test.cc (100%) rename {cpp => native-sql-engine/cpp}/src/tests/test_utils.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/arrow/utils/hashing.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/arrow/vendored/xxhash/README.md (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/arrow/vendored/xxhash/xxh3.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/arrow/vendored/xxhash/xxhash.c (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/arrow/vendored/xxhash/xxhash.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/datetime/README.md (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/datetime/date.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/gandiva/CMakeLists.txt (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/gandiva/decimal_ops.cc (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/gandiva/decimal_ops.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/gandiva/epoch_time_point.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/gandiva/time.cc (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/gandiva/time_constants.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/gandiva/time_fields.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/gandiva/types.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/murmurhash/murmurhash32.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/murmurhash/murmurhash64.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/row_wise_memory/hashMap.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/row_wise_memory/native_memory.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/row_wise_memory/unsafe_row.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/ska_sort.hpp (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/dense_hash_map (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/dense_hash_set (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/internal/densehashtable.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/internal/hashtable-common.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/internal/libc_allocator_with_realloc.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/internal/sparsehashtable.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/sparse_hash_map (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/sparse_hash_map.h (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/sparse_hash_set (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/sparsetable (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/sparsehash/traits (100%) rename {cpp => native-sql-engine/cpp}/src/third_party/timsort.hpp (100%) rename {cpp => native-sql-engine/cpp}/src/utils/macros.h (100%) rename {tools => native-sql-engine/tools}/gitdiff_AdaptiveSparkPlanExec.patch (100%) rename {tools => native-sql-engine/tools}/process.py (100%) rename {tools => native-sql-engine/tools}/run_ut.sh (100%) create mode 100644 pom.xml create mode 100644 scalastyle-config.xml diff --git a/.clang-format b/.clang-format deleted file mode 100644 index 06453dfbb..000000000 --- a/.clang-format +++ /dev/null @@ -1,20 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. ---- -BasedOnStyle: Google -DerivePointerAlignment: false -ColumnLimit: 90 diff --git a/.github/workflows/report_ram_log.yml b/.github/workflows/report_ram_log.yml index 2fef9911c..6d7bc0dc5 100644 --- a/.github/workflows/report_ram_log.yml +++ b/.github/workflows/report_ram_log.yml @@ -61,7 +61,7 @@ jobs: mvn clean install -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DskipTests - name: Run Maven tests run: | - cd core/ + cd native-sql-engine/core/ mvn test -B -DmembersOnlySuites=com.intel.oap.tpc.h -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DtagsToInclude=com.intel.oap.tags.CommentOnContextPR -Dexec.skip=true env: MAVEN_OPTS: "-Xmx2048m" diff --git a/.github/workflows/tpch.yml b/.github/workflows/tpch.yml index 8f6908d77..903af77f0 100644 --- a/.github/workflows/tpch.yml +++ b/.github/workflows/tpch.yml @@ -56,7 +56,7 @@ jobs: mvn clean install -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn - name: Run Maven tests - BHJ run: | - cd core/ + cd native-sql-engine/core/ mvn test -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DmembersOnlySuites=com.intel.oap.tpc.h -DtagsToInclude=com.intel.oap.tags.BroadcastHashJoinMode -DargLine="-Xmx1G -XX:MaxDirectMemorySize=500M -Dio.netty.allocator.numDirectArena=1" env: MALLOC_ARENA_MAX: "4" @@ -66,7 +66,7 @@ jobs: ENABLE_TPCH_TESTS: "true" - name: Run Maven tests - SMJ run: | - cd core/ + cd native-sql-engine/core/ mvn test -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DmembersOnlySuites=com.intel.oap.tpc.h -DtagsToInclude=com.intel.oap.tags.SortMergeJoinMode -DargLine="-Xmx1G -XX:MaxDirectMemorySize=500M -Dio.netty.allocator.numDirectArena=1" env: MALLOC_ARENA_MAX: "4" diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index 0cdf3f470..83020c709 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -51,7 +51,7 @@ jobs: sudo make install - name: Run unit tests run: | - cd cpp/ + cd native-sql-engine/cpp/ mkdir -p build cd build cmake .. -DTESTS=1 diff --git a/.gitignore b/.gitignore index 58c6c9d4a..fc167d012 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,48 @@ # IDEA config files .idea/ *.iml +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +.idea/ +target/ +*.iml + +**/target/** + +# logs +*.log + +thirdparty/*.tar* +CMakeFiles/ +CMakeCache.txt +CTestTestfile.cmake +Makefile +cmake_install.cmake +build/ +*-build/ +Testing/ +cmake-build-debug/ +cmake-build-release/ + +# Editor temporary/working/backup files # +.#* +*\#*\# +[#]*# +*~ +*$ +*.bak +*flymake* +*.kdev4 +*.swp +scalastyle-output.xml diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 2d9d38326..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "dep/arrow-data-source"] - path = dep/arrow-data-source - url = https://github.com/oap-project/arrow-data-source diff --git a/arrow-data-source/.github/PULL_REQUEST_TEMPLATE b/arrow-data-source/.github/PULL_REQUEST_TEMPLATE new file mode 100644 index 000000000..989e95ccd --- /dev/null +++ b/arrow-data-source/.github/PULL_REQUEST_TEMPLATE @@ -0,0 +1,12 @@ +## What changes were proposed in this pull request? + +(Please fill in changes proposed in this fix) + + +## How was this patch tested? + +(Please explain how this patch was tested. E.g. unit tests, integration tests, manual tests) + + +(If this patch involves UI changes, please attach a screenshot; otherwise, remove this) + diff --git a/arrow-data-source/.github/workflows/dev_cron.yml b/arrow-data-source/.github/workflows/dev_cron.yml new file mode 100644 index 000000000..ab2840ebd --- /dev/null +++ b/arrow-data-source/.github/workflows/dev_cron.yml @@ -0,0 +1,58 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Dev PR + +on: + + pull_request_target: + types: + - opened + - edited + - synchronize + +jobs: + process: + name: Process + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Comment Issues link + if: | + github.event_name == 'pull_request_target' && + (github.event.action == 'opened' || + github.event.action == 'edited') + uses: actions/github-script@v3 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const script = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/dev_cron/issues_link.js`); + script({github, context}); + + - name: Check title + if: | + github.event_name == 'pull_request_target' && + (github.event.action == 'opened' || + github.event.action == 'edited') + uses: actions/github-script@v3 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const script = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/dev_cron/title_check.js`); + script({github, context}); + diff --git a/arrow-data-source/.github/workflows/dev_cron/issues_link.js b/arrow-data-source/.github/workflows/dev_cron/issues_link.js new file mode 100644 index 000000000..1794b2566 --- /dev/null +++ b/arrow-data-source/.github/workflows/dev_cron/issues_link.js @@ -0,0 +1,70 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +function detectISSUESID(title) { + if (!title) { + return null; + } + const matched = /^\[NSE-\d+\]/.exec(title); + if (!matched) { + return null; + } + const issues_number = matched[0].replace(/[^0-9]/ig,""); + return issues_number; +} + +async function haveComment(github, context, pullRequestNumber, body) { + const options = { + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequestNumber, + page: 1 + }; + while (true) { + const response = await github.issues.listComments(options); + if (response.data.some(comment => comment.body === body)) { + return true; + } + if (!/;\s*rel="next"/.test(response.headers.link || "")) { + break; + } + options.page++; + } + return false; +} + +async function commentISSUESURL(github, context, pullRequestNumber, issuesID) { + const issuesURL = `https://github.com/oap-project/native-sql-engine/issues/${issuesID}`; + if (await haveComment(github, context, pullRequestNumber, issuesURL)) { + return; + } + await github.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequestNumber, + body: issuesURL + }); +} + +module.exports = async ({github, context}) => { + const pullRequestNumber = context.payload.number; + const title = context.payload.pull_request.title; + const issuesID = detectISSUESID(title); + if (issuesID) { + await commentISSUESURL(github, context, pullRequestNumber, issuesID); + } +}; diff --git a/arrow-data-source/.github/workflows/dev_cron/title_check.js b/arrow-data-source/.github/workflows/dev_cron/title_check.js new file mode 100644 index 000000000..9380a4344 --- /dev/null +++ b/arrow-data-source/.github/workflows/dev_cron/title_check.js @@ -0,0 +1,53 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +const fs = require("fs"); + +function haveISSUESID(title) { + if (!title) { + return false; + } + return /^\[NSE-\d+\]/.test(title); +} + +async function commentOpenISSUESIssue(github, context, pullRequestNumber) { + const {data: comments} = await github.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequestNumber, + per_page: 1 + }); + if (comments.length > 0) { + return; + } + const commentPath = ".github/workflows/dev_cron/title_check.md"; + const comment = fs.readFileSync(commentPath).toString(); + await github.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequestNumber, + body: comment + }); +} + +module.exports = async ({github, context}) => { + const pullRequestNumber = context.payload.number; + const title = context.payload.pull_request.title; + if (!haveISSUESID(title)) { + await commentOpenISSUESIssue(github, context, pullRequestNumber); + } +}; diff --git a/arrow-data-source/.github/workflows/dev_cron/title_check.md b/arrow-data-source/.github/workflows/dev_cron/title_check.md new file mode 100644 index 000000000..928a8fc4b --- /dev/null +++ b/arrow-data-source/.github/workflows/dev_cron/title_check.md @@ -0,0 +1,33 @@ + + +Thanks for opening a pull request! + +Could you open an issue for this pull request on Github Issues? + +https://github.com/oap-project/native-sql-engine/issues + +Then could you also rename ***commit message*** and ***pull request title*** in the following format? + + [NSE-${ISSUES_ID}] ${detailed message} + +See also: + + * [Other pull requests](https://github.com/oap-project/native-sql-engine/pulls/) + diff --git a/arrow-data-source/.github/workflows/report_ram_log.yml b/arrow-data-source/.github/workflows/report_ram_log.yml new file mode 100644 index 000000000..2fef9911c --- /dev/null +++ b/arrow-data-source/.github/workflows/report_ram_log.yml @@ -0,0 +1,72 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Report RAM Log + +on: + workflow_run: + workflows: ["Native SQL Engine TPC-H Suite"] + types: + - completed + +jobs: + comment-on-pr: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Download log + uses: dawidd6/action-download-artifact@v2 + with: + workflow: tpch.yml + run_id: ${{ github.event.workflow_run.id }} + name: comment_content + path: /tmp/ + - name: Download previous event payload + uses: dawidd6/action-download-artifact@v2 + with: + workflow: tpch.yml + run_id: ${{ github.event.workflow_run.id }} + name: pr_event + path: /tmp/ + - name: Install OAP optimized Arrow + run: | + cd /tmp + git clone -b arrow-3.0.0-oap https://github.com/oap-project/arrow.git + cd arrow/java + mvn clean install -B -P arrow-jni -am -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -Darrow.cpp.build.dir=/tmp/arrow/cpp/build/release/ -DskipTests -Dcheckstyle.skip + - name: Install Arrow datasource + run: | + cd /tmp + git clone https://github.com/oap-project/arrow-data-source.git + cd arrow-data-source + mvn clean install -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DskipTests + - name: Run Maven tests + run: | + cd core/ + mvn test -B -DmembersOnlySuites=com.intel.oap.tpc.h -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DtagsToInclude=com.intel.oap.tags.CommentOnContextPR -Dexec.skip=true + env: + MAVEN_OPTS: "-Xmx2048m" + COMMENT_CONTENT_PATH: "/tmp/comment.md" + PREVIOUS_EVENT_PATH: "/tmp/event.json" + GITHUB_TOKEN: ${{ github.token }} + ENABLE_TPCH_TESTS: "true" + diff --git a/arrow-data-source/.github/workflows/tpch.yml b/arrow-data-source/.github/workflows/tpch.yml new file mode 100644 index 000000000..8f6908d77 --- /dev/null +++ b/arrow-data-source/.github/workflows/tpch.yml @@ -0,0 +1,90 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Native SQL Engine TPC-H Suite + +on: + pull_request + +jobs: + ram-usage-test: + if: ${{ !contains(github.event.pull_request.labels.*.name, 'No RAM Report') }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - uses: iterative/setup-cml@v1 + with: + version: latest + - run: sudo swapoff -a + - run: free + - run: sudo apt-get update + - run: sudo apt-get install cmake + - run: sudo apt-get install libboost-all-dev + - name: Install OAP optimized Arrow + run: | + cd /tmp + git clone https://github.com/oap-project/arrow.git + cd arrow && git checkout arrow-3.0.0-oap && cd cpp + mkdir build && cd build + cmake .. -DARROW_JNI=ON -DARROW_GANDIVA_JAVA=ON -DARROW_GANDIVA=ON -DARROW_PARQUET=ON -DARROW_HDFS=ON -DARROW_FILESYSTEM=ON -DARROW_WITH_SNAPPY=ON -DARROW_JSON=ON -DARROW_DATASET=ON -DARROW_WITH_LZ4=ON -DARROW_JEMALLOC=OFF && make -j2 + sudo make install + cd ../../java + mvn clean install -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -P arrow-jni -am -Darrow.cpp.build.dir=/tmp/arrow/cpp/build/release/ -DskipTests -Dcheckstyle.skip + - name: Install Arrow datasource + run: | + cd /tmp + git clone https://github.com/oap-project/arrow-data-source.git + cd arrow-data-source + mvn clean install -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn + - name: Run Maven tests - BHJ + run: | + cd core/ + mvn test -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DmembersOnlySuites=com.intel.oap.tpc.h -DtagsToInclude=com.intel.oap.tags.BroadcastHashJoinMode -DargLine="-Xmx1G -XX:MaxDirectMemorySize=500M -Dio.netty.allocator.numDirectArena=1" + env: + MALLOC_ARENA_MAX: "4" + MAVEN_OPTS: "-Xmx1G" + COMMENT_TEXT_OUTPUT_PATH: "/tmp/comment_text_1.txt" + COMMENT_IMAGE_OUTPUT_PATH: "/tmp/comment_image_1.png" + ENABLE_TPCH_TESTS: "true" + - name: Run Maven tests - SMJ + run: | + cd core/ + mvn test -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DmembersOnlySuites=com.intel.oap.tpc.h -DtagsToInclude=com.intel.oap.tags.SortMergeJoinMode -DargLine="-Xmx1G -XX:MaxDirectMemorySize=500M -Dio.netty.allocator.numDirectArena=1" + env: + MALLOC_ARENA_MAX: "4" + MAVEN_OPTS: "-Xmx1G" + COMMENT_TEXT_OUTPUT_PATH: "/tmp/comment_text_2.txt" + COMMENT_IMAGE_OUTPUT_PATH: "/tmp/comment_image_2.png" + ENABLE_TPCH_TESTS: "true" + - run: | + cml-publish /tmp/comment_image_1.png --md > /tmp/comment.md + cml-publish /tmp/comment_image_2.png --md >> /tmp/comment.md + - run: echo "::set-output name=event_path::${GITHUB_EVENT_PATH}" + id: output-envs + - uses: actions/upload-artifact@v2 + with: + name: comment_content + path: /tmp/comment.md + - uses: actions/upload-artifact@v2 + with: + name: pr_event + path: ${{steps.output-envs.outputs.event_path}} + diff --git a/arrow-data-source/.github/workflows/unittests.yml b/arrow-data-source/.github/workflows/unittests.yml new file mode 100644 index 000000000..0cdf3f470 --- /dev/null +++ b/arrow-data-source/.github/workflows/unittests.yml @@ -0,0 +1,61 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Native SQL Engine Unit Tests Suite + +on: + pull_request + +jobs: + cpp-unit-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - run: sudo swapoff -a + - run: free + - run: sudo apt-get update + - run: sudo apt-get install cmake + - run: sudo apt-get install libboost-all-dev + - name: Install Googletest + run: | + sudo apt-get install libgtest-dev + cd /usr/src/gtest + sudo cmake CMakeLists.txt -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr/local + sudo make + sudo apt-get install google-mock + - name: Install OAP optimized Arrow (C++ libs) + run: | + cd /tmp + git clone https://github.com/oap-project/arrow.git + cd arrow && git checkout arrow-3.0.0-oap && cd cpp + mkdir build && cd build + cmake .. -DARROW_JNI=ON -DARROW_GANDIVA_JAVA=ON -DARROW_GANDIVA=ON -DARROW_PARQUET=ON -DARROW_HDFS=ON -DARROW_FILESYSTEM=ON -DARROW_WITH_SNAPPY=ON -DARROW_JSON=ON -DARROW_DATASET=ON -DARROW_WITH_LZ4=ON -DGTEST_ROOT=/usr/src/gtest && make -j2 + sudo make install + - name: Run unit tests + run: | + cd cpp/ + mkdir -p build + cd build + cmake .. -DTESTS=1 + make + cd src + ctest -R + diff --git a/.travis.yml b/arrow-data-source/.travis.yml similarity index 100% rename from .travis.yml rename to arrow-data-source/.travis.yml diff --git a/CHANGELOG.md b/arrow-data-source/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to arrow-data-source/CHANGELOG.md diff --git a/LICENSE.txt b/arrow-data-source/LICENSE.txt similarity index 100% rename from LICENSE.txt rename to arrow-data-source/LICENSE.txt diff --git a/arrow-data-source/README.md b/arrow-data-source/README.md new file mode 100644 index 000000000..0409f46c9 --- /dev/null +++ b/arrow-data-source/README.md @@ -0,0 +1,235 @@ +# Arrow Data Source + +A Spark DataSource implementation for reading files into Arrow compatible columnar vectors. + +## Note + +The development of this library is still in progress. As a result some of the functionality may not be constantly stable for being used in production environments that have not been fully considered due to the limited testing capabilities so far. + +## Online Documentation + +You can find the all the Native SQL Engine documents on the [project web page](https://oap-project.github.io/arrow-data-source/). + +## Build + +### Prerequisite + +There are some requirements before you build the project. +Please make sure you have already installed the software in your system. + +1. gcc 9.3 or higher version +2. java8 OpenJDK -> yum install java-1.8.0-openjdk +3. cmake 3.2 or higher version +4. maven 3.1.1 or higher version +5. Hadoop 2.7.5 or higher version +6. Spark 3.0.0 or higher version +7. Intel Optimized Arrow 3.0.0 + +### Building by Conda + +If you already have a working Hadoop Spark Cluster, we provide a Conda package which will automatically install dependencies needed by OAP, you can refer to [OAP-Installation-Guide](./docs/OAP-Installation-Guide.md) for more information. Once finished [OAP-Installation-Guide](./docs/OAP-Installation-Guide.md), you can find built `spark-arrow-datasource-standard--jar-with-dependencies.jar` under `$HOME/miniconda2/envs/oapenv/oap_jars`. +Then you can just skip steps below and jump to [Get Started](#get-started). + +### cmake installation + +If you are facing some trouble when installing cmake, please follow below steps to install cmake. + +``` +// installing cmake 3.2 +sudo yum install cmake3 + +// If you have an existing cmake, you can use below command to set it as an option within alternatives command +sudo alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake 10 --slave /usr/local/bin/ctest ctest /usr/bin/ctest --slave /usr/local/bin/cpack cpack /usr/bin/cpack --slave /usr/local/bin/ccmake ccmake /usr/bin/ccmake --family cmake + +// Set cmake3 as an option within alternatives command +sudo alternatives --install /usr/local/bin/cmake cmake /usr/bin/cmake3 20 --slave /usr/local/bin/ctest ctest /usr/bin/ctest3 --slave /usr/local/bin/cpack cpack /usr/bin/cpack3 --slave /usr/local/bin/ccmake ccmake /usr/bin/ccmake3 --family cmake + +// Use alternatives to choose cmake version +sudo alternatives --config cmake +``` + +### maven installation + +If you are facing some trouble when installing maven, please follow below steps to install maven + +``` +// installing maven 3.6.3 +Go to https://maven.apache.org/download.cgi and download the specific version of maven + +// Below command use maven 3.6.3 as an example +wget https://ftp.wayne.edu/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz +tar xzf apache-maven-3.6.3-bin.tar.gz +mkdir /usr/local/maven +mv apache-maven-3.6.3/ /usr/local/maven/ + +// Set maven 3.6.3 as an option within alternatives command +sudo alternatives --install /usr/bin/mvn mvn /usr/local/maven/apache-maven-3.6.3/bin/mvn 1 + +// Use alternatives to choose mvn version +sudo alternatives --config mvn +``` + +### Hadoop Native Library(Default) + +Please make sure you have set up Hadoop directory properly with Hadoop Native Libraries +By default, Apache Arrow would scan `$HADOOP_HOME` and find the native Hadoop library `libhdfs.so`(under `$HADOOP_HOME/lib/native` directory) to be used for Hadoop client. + +You can also use `ARROW_LIBHDFS_DIR` to configure the location of `libhdfs.so` if it is installed in other directory than `$HADOOP_HOME/lib/native` + +If your SPARK and HADOOP are separated in different nodes, please find `libhdfs.so` in your Hadoop cluster and copy it to SPARK cluster, then use one of the above methods to set it properly. + +For more information, please check +Arrow HDFS interface [documentation](https://github.com/apache/arrow/blob/master/cpp/apidoc/HDFS.md) +Hadoop Native Library, please read the official Hadoop website [documentation](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/NativeLibraries.html) + +### Use libhdfs3 library for better performance(Optional) + +For better performance ArrowDataSource reads HDFS files using the third-party library `libhdfs3`. The library must be pre-installed on machines Spark Executor nodes are running on. + +To install the library, use of [Conda](https://docs.conda.io/en/latest/) is recommended. + +``` +// installing libhdfs3 +conda install -c conda-forge libhdfs3 + +// check the installed library file +ll ~/miniconda/envs/$(YOUR_ENV_NAME)/lib/libhdfs3.so +``` + +To set up libhdfs3, there are two different ways: +Option1: Overwrite the soft link for libhdfs.so +To install libhdfs3.so, you have to create a soft link for libhdfs.so in your Hadoop directory(`$HADOOP_HOME/lib/native` by default). + +``` +ln -f -s libhdfs3.so libhdfs.so +``` + +Option2: +Add env variable to the system +``` +export ARROW_LIBHDFS3_DIR="PATH_TO_LIBHDFS3_DIR/" +``` + +Add following Spark configuration options before running the DataSource to make the library to be recognized: +* `spark.executorEnv.ARROW_LIBHDFS3_DIR = "PATH_TO_LIBHDFS3_DIR/"` +* `spark.executorEnv.LD_LIBRARY_PATH = "PATH_TO_LIBHDFS3_DEPENDENCIES_DIR/"` + +Please notes: If you choose to use libhdfs3.so, there are some other dependency libraries you have to installed such as libprotobuf or libcrypto. + +### Build and install IntelĀ® Optimized Arrow with Datasets Java API +You have to use a customized Arrow to support for our datasets Java API. + +``` +// build arrow-cpp +git clone -b https://github.com/Intel-bigdata/arrow.git +cd arrow/cpp +mkdir build +cd build +cmake -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_GANDIVA_JAVA=ON -DARROW_GANDIVA=ON -DARROW_PARQUET=ON -DARROW_HDFS=ON -DARROW_BOOST_USE_SHARED=ON -DARROW_JNI=ON -DARROW_DATASET=ON -DARROW_WITH_PROTOBUF=ON -DARROW_WITH_SNAPPY=ON -DARROW_WITH_LZ4=ON -DARROW_FILESYSTEM=ON -DARROW_JSON=ON .. +make + +// build and install arrow jvm library +cd ../../java +mvn clean install -P arrow-jni -am -Darrow.cpp.build.dir=$PATH_TO_ARROW_SOURCE_CODE/arrow/cpp/build/release +``` + +### Build Arrow Data Source Library + +``` +// Download Arrow Data Source Code +git clone -b https://github.com/oap-project/arrow-data-source.git + +// Go to the directory +cd arrow-data-source + +// build +mvn clean -DskipTests package + +// check built jar library +readlink -f standard/target/spark-arrow-datasource-standard--jar-with-dependencies.jar +``` + +### Download Spark 3.0.0 + +Currently ArrowDataSource works on the Spark 3.0.0 version. + +``` +wget http://archive.apache.org/dist/spark/spark-3.0.0/spark-3.0.0-bin-hadoop2.7.tgz +tar -xf ./spark-3.0.0-bin-hadoop2.7.tgz +export SPARK_HOME=`pwd`/spark-3.0.0-bin-hadoop2.7 +``` + +If you are new to Apache Spark, please go though [Spark's official deploying guide](https://spark.apache.org/docs/latest/cluster-overview.html) before getting started with ArrowDataSource. + +## Get started +### Add extra class pathes to Spark + +To enable ArrowDataSource, the previous built jar `spark-arrow-datasource-standard--jar-with-dependencies.jar` should be added to Spark configuration. Typically the options are: + +* `spark.driver.extraClassPath` : Set to load jar file to driver. +* `spark.executor.extraClassPath` : Set to load jar file to executor. +* `jars` : Set to copy jar file to the executors when using yarn cluster mode. +* `spark.executorEnv.ARROW_LIBHDFS3_DIR` : Optional if you are using a custom libhdfs3.so. +* `spark.executorEnv.LD_LIBRARY_PATH` : Optional if you are using a custom libhdfs3.so. + +For Spark Standalone Mode, please set the above value as relative path to the jar file. +For Spark Yarn Cluster Mode, please set the above value as absolute path to the jar file. + +Example to run Spark Shell with ArrowDataSource jar file +``` +${SPARK_HOME}/bin/spark-shell \ + --verbose \ + --master yarn \ + --driver-memory 10G \ + --conf spark.driver.extraClassPath=$PATH_TO_DATASOURCE_DIR/spark-arrow-datasource-standard--jar-with-dependencies.jar \ + --conf spark.executor.extraClassPath=$PATH_TO_DATASOURCE_DIR/spark-arrow-datasource-standard--jar-with-dependencies.jar \ + --conf spark.driver.cores=1 \ + --conf spark.executor.instances=12 \ + --conf spark.executor.cores=6 \ + --conf spark.executor.memory=20G \ + --conf spark.memory.offHeap.size=80G \ + --conf spark.task.cpus=1 \ + --conf spark.locality.wait=0s \ + --conf spark.sql.shuffle.partitions=72 \ + --conf spark.executorEnv.ARROW_LIBHDFS3_DIR="$PATH_TO_LIBHDFS3_DIR/" \ + --conf spark.executorEnv.LD_LIBRARY_PATH="$PATH_TO_LIBHDFS3_DEPENDENCIES_DIR" +``` + +For more information about these options, please read the official Spark [documentation](https://spark.apache.org/docs/latest/configuration.html#runtime-environment). + +### Run a query with ArrowDataSource (Scala) + +```scala +val path = "${PATH_TO_YOUR_PARQUET_FILE}" +val df = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .format("arrow") + .load(path) +df.createOrReplaceTempView("my_temp_view") +spark.sql("SELECT * FROM my_temp_view LIMIT 10").show(10) +``` +### To validate if ArrowDataSource works properly + +To validate if ArrowDataSource works, you can go to the DAG to check if ArrowScan has been used from the above example query. + +![Image of ArrowDataSource Validation](./docs/image/arrowdatasource_validation.png) + + +## Work together with ParquetDataSource (experimental) + +We provide a customized replacement of Spark's built-in ParquetFileFormat. By so users don't have +to change existing Parquet-based SQL/code and will be able to read Arrow data from Parquet directly. +More importantly, sometimes the feature could be extremely helpful to make ArrowDataSource work correctly +with some 3rd-party storage tools (e.g. [Delta Lake](https://github.com/delta-io/delta)) that are built on top of ParquetDataSource. + +To replace built-in ParquetDataSource, the only thing has to be done is to place compiled jar `spark-arrow-datasource-parquet-.jar` into +Spark's library folder. + +If you'd like to verify that ParquetDataSource is successfully overwritten by the jar, run following code +before executing SQL job: +``` +ServiceLoaderUtil.ensureParquetFileFormatOverwritten(); +``` + +Note the whole feature is currently **experimental** and only DataSource v1 is supported. V2 support is being planned. diff --git a/arrow-data-source/common/pom.xml b/arrow-data-source/common/pom.xml new file mode 100644 index 000000000..2a752774a --- /dev/null +++ b/arrow-data-source/common/pom.xml @@ -0,0 +1,77 @@ + + + + spark-arrow-datasource + com.intel.oap + 1.1.0 + + 4.0.0 + + spark-arrow-datasource-common + + ${project.basedir}/src/main/scala + ${project.basedir}/src/test/scala + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + compile + + compile + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-src-1 + generate-sources + + add-source + + + + ${project.basedir}/src/main/java + + + + + + + + + + + org.scala-tools + maven-scala-plugin + + ${scala.version} + + + + + diff --git a/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/NativeSQLMemoryConsumer.java b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/NativeSQLMemoryConsumer.java new file mode 100644 index 000000000..45888521e --- /dev/null +++ b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/NativeSQLMemoryConsumer.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow; + +import org.apache.arrow.memory.OutOfMemoryException; +import org.apache.spark.memory.MemoryConsumer; +import org.apache.spark.memory.MemoryMode; +import org.apache.spark.memory.TaskMemoryManager; + +import java.io.IOException; + +public class NativeSQLMemoryConsumer extends MemoryConsumer { + + private final Spiller spiller; + + public NativeSQLMemoryConsumer(TaskMemoryManager taskMemoryManager, Spiller spiller) { + super(taskMemoryManager, taskMemoryManager.pageSizeBytes(), MemoryMode.OFF_HEAP); + this.spiller = spiller; + } + + @Override + public long spill(long size, MemoryConsumer trigger) throws IOException { + return spiller.spill(size, trigger); + } + + + public void acquire(long size) { + if (size == 0) { + return; + } + long granted = acquireMemory(size); + if (granted < size) { + freeMemory(granted); + throw new OutOfMemoryException("Not enough spark off-heap execution memory. " + + "Acquired: " + size + ", granted: " + granted + ". " + + "Try tweaking config option spark.memory.offHeap.size to " + + "get larger space to run this application. "); + } + } + + public void free(long size) { + freeMemory(size); + } +} diff --git a/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/NativeSQLMemoryMetrics.java b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/NativeSQLMemoryMetrics.java new file mode 100644 index 000000000..c26054b3c --- /dev/null +++ b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/NativeSQLMemoryMetrics.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow; + +import java.util.concurrent.atomic.AtomicLong; + +public final class NativeSQLMemoryMetrics { + private final AtomicLong peak = new AtomicLong(0L); + private final AtomicLong total = new AtomicLong(0L); + + public void inc(long bytes) { + final long total = this.total.addAndGet(bytes); + long prev_peak; + do { + prev_peak = this.peak.get(); + if (total <= prev_peak) { + break; + } + } while (!this.peak.compareAndSet(prev_peak, total)); + } + + public long peak() { + return peak.get(); + } + + public long total() { + return total.get(); + } +} diff --git a/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/SparkManagedAllocationListener.java b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/SparkManagedAllocationListener.java new file mode 100644 index 000000000..abdabcc26 --- /dev/null +++ b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/SparkManagedAllocationListener.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow; + +import org.apache.arrow.memory.AllocationListener; + +public class SparkManagedAllocationListener implements AllocationListener { + + private final NativeSQLMemoryConsumer consumer; + private final NativeSQLMemoryMetrics metrics; + + public SparkManagedAllocationListener(NativeSQLMemoryConsumer consumer, NativeSQLMemoryMetrics metrics) { + this.consumer = consumer; + this.metrics = metrics; + } + + @Override + public void onPreAllocation(long size) { + consumer.acquire(size); + metrics.inc(size); + } + + @Override + public void onRelease(long size) { + consumer.free(size); + metrics.inc(-size); + } +} diff --git a/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/SparkManagedReservationListener.java b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/SparkManagedReservationListener.java new file mode 100644 index 000000000..47c1a9890 --- /dev/null +++ b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/SparkManagedReservationListener.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow; + +import org.apache.arrow.memory.ReservationListener; + +/** + * Reserve Spark managed memory. + */ +public class SparkManagedReservationListener implements ReservationListener { + + private final NativeSQLMemoryConsumer consumer; + private final NativeSQLMemoryMetrics metrics; + + public SparkManagedReservationListener(NativeSQLMemoryConsumer consumer, NativeSQLMemoryMetrics metrics) { + this.consumer = consumer; + this.metrics = metrics; + } + + @Override + public void reserve(long size) { + consumer.acquire(size); + metrics.inc(size); + } + + @Override + public void unreserve(long size) { + consumer.free(size); + metrics.inc(-size); + } +} diff --git a/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/Spiller.java b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/Spiller.java new file mode 100644 index 000000000..7702fbc74 --- /dev/null +++ b/arrow-data-source/common/src/main/java/com/intel/oap/spark/sql/execution/datasources/v2/arrow/Spiller.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow; + +import org.apache.spark.memory.MemoryConsumer; + +public interface Spiller { + Spiller NO_OP = new Spiller() { + @Override + public long spill(long size, MemoryConsumer trigger) { + return 0L; + } + }; + + long spill(long size, MemoryConsumer trigger); +} diff --git a/core/src/main/java/com/intel/oap/vectorized/ArrowWritableColumnVector.java b/arrow-data-source/common/src/main/java/com/intel/oap/vectorized/ArrowWritableColumnVector.java similarity index 99% rename from core/src/main/java/com/intel/oap/vectorized/ArrowWritableColumnVector.java rename to arrow-data-source/common/src/main/java/com/intel/oap/vectorized/ArrowWritableColumnVector.java index ad0ad8aeb..b89e74fb6 100644 --- a/core/src/main/java/com/intel/oap/vectorized/ArrowWritableColumnVector.java +++ b/arrow-data-source/common/src/main/java/com/intel/oap/vectorized/ArrowWritableColumnVector.java @@ -17,7 +17,6 @@ package com.intel.oap.vectorized; -import org.apache.arrow.memory.ArrowBuf; import java.lang.*; import java.math.BigDecimal; import java.nio.ByteBuffer; diff --git a/arrow-data-source/common/src/main/scala/org/apache/spark/sql/execution/datasources/v2/arrow/SparkMemoryUtils.scala b/arrow-data-source/common/src/main/scala/org/apache/spark/sql/execution/datasources/v2/arrow/SparkMemoryUtils.scala new file mode 100644 index 000000000..bc11a47e3 --- /dev/null +++ b/arrow-data-source/common/src/main/scala/org/apache/spark/sql/execution/datasources/v2/arrow/SparkMemoryUtils.scala @@ -0,0 +1,229 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.execution.datasources.v2.arrow + +import java.util +import java.util.UUID + +import scala.collection.JavaConverters._ + +import com.intel.oap.spark.sql.execution.datasources.v2.arrow._ +import org.apache.arrow.dataset.jni.NativeMemoryPool +import org.apache.arrow.memory.BufferAllocator + +import org.apache.spark.TaskContext +import org.apache.spark.memory.TaskMemoryManager +import org.apache.spark.util.TaskCompletionListener + +object SparkMemoryUtils { + + class TaskMemoryResources { + if (!inSparkTask()) { + throw new IllegalStateException("Creating TaskMemoryResources instance out of Spark task") + } + + val sharedMetrics = new NativeSQLMemoryMetrics() + val defaultAllocator: BufferAllocator = { + + val globalAlloc = globalAllocator() + val al = new SparkManagedAllocationListener( + new NativeSQLMemoryConsumer(getTaskMemoryManager(), Spiller.NO_OP), + sharedMetrics) + val parent = globalAlloc + parent.newChildAllocator("Spark Managed Allocator - " + + UUID.randomUUID().toString, al, 0, parent.getLimit) + } + + val defaultMemoryPool: NativeMemoryPool = { + val rl = new SparkManagedReservationListener( + new NativeSQLMemoryConsumer(getTaskMemoryManager(), Spiller.NO_OP), + sharedMetrics) + NativeMemoryPool.createListenable(rl) + } + + private val allocators = new util.ArrayList[BufferAllocator]() + allocators.add(defaultAllocator) + + private val memoryPools = new util.ArrayList[NativeMemoryPool]() + memoryPools.add(defaultMemoryPool) + + def createSpillableMemoryPool(spiller: Spiller): NativeMemoryPool = { + val rl = new SparkManagedReservationListener( + new NativeSQLMemoryConsumer(getTaskMemoryManager(), spiller), + sharedMetrics) + val pool = NativeMemoryPool.createListenable(rl) + memoryPools.add(pool) + pool + } + + def createSpillableAllocator(spiller: Spiller): BufferAllocator = { + val al = new SparkManagedAllocationListener( + new NativeSQLMemoryConsumer(getTaskMemoryManager(), spiller), + sharedMetrics) + val parent = globalAllocator() + val alloc = parent.newChildAllocator("Spark Managed Allocator - " + + UUID.randomUUID().toString, al, 0, parent.getLimit).asInstanceOf[BufferAllocator] + allocators.add(alloc) + alloc + } + + private def close(allocator: BufferAllocator): Unit = { + allocator.getChildAllocators.forEach(close(_)) + allocator.close() + } + + /** + * Close the allocator quietly without having any OOM errors thrown. We rely on Spark's memory + * management system to detect possible memory leaks after the task get successfully down. Any + * leak shown right here is possibly not actual because buffers may be cleaned up after + * this check code is executed. Having said that developers should manage to make sure + * the specific clean up logic of operators is registered at last of the program which means + * it will be executed earlier. + * + * @see org.apache.spark.executor.Executor.TaskRunner#run() + */ + private def softClose(allocator: BufferAllocator): Unit = { + // move to leaked list + leakedAllocators.add(allocator) + } + + private def close(pool: NativeMemoryPool): Unit = { + pool.close() + } + + private def softClose(pool: NativeMemoryPool): Unit = { + // move to leaked list + leakedMemoryPools.add(pool) + } + + def release(): Unit = { + for (allocator <- allocators.asScala) { + val allocated = allocator.getAllocatedMemory + if (allocated == 0L) { + close(allocator) + } else { + softClose(allocator) + } + } + for (pool <- memoryPools.asScala) { + val allocated = pool.getBytesAllocated + if (allocated == 0L) { + close(pool) + } else { + softClose(pool) + } + } + } + } + + private val taskToResourcesMap = new java.util.IdentityHashMap[TaskContext, TaskMemoryResources]() + + private val leakedAllocators = new java.util.Vector[BufferAllocator]() + private val leakedMemoryPools = new java.util.Vector[NativeMemoryPool]() + + private def getLocalTaskContext: TaskContext = TaskContext.get() + + private def getTaskMemoryManager(): TaskMemoryManager = { + getLocalTaskContext.taskMemoryManager() + } + + private def inSparkTask(): Boolean = { + getLocalTaskContext != null + } + + def addLeakSafeTaskCompletionListener[U](f: TaskContext => U): TaskContext = { + if (!inSparkTask()) { + throw new IllegalStateException("Not in a Spark task") + } + getTaskMemoryResources() // initialize cleaners + getLocalTaskContext.addTaskCompletionListener(f) + } + + def getTaskMemoryResources(): TaskMemoryResources = { + if (!inSparkTask()) { + throw new IllegalStateException("Not in a Spark task") + } + val tc = getLocalTaskContext + taskToResourcesMap.synchronized { + + if (!taskToResourcesMap.containsKey(tc)) { + val resources = new TaskMemoryResources + getLocalTaskContext.addTaskCompletionListener( + new TaskCompletionListener { + override def onTaskCompletion(context: TaskContext): Unit = { + taskToResourcesMap.synchronized { + val resources = taskToResourcesMap.remove(context) + resources.release() + context.taskMetrics().incPeakExecutionMemory(resources.sharedMetrics.peak()) + } + } + }) + taskToResourcesMap.put(tc, resources) + } + + return taskToResourcesMap.get(tc) + } + } + + def globalAllocator(): BufferAllocator = { + org.apache.spark.sql.util.ArrowUtils.rootAllocator + } + + def globalMemoryPool(): NativeMemoryPool = { + NativeMemoryPool.getDefault + } + + def createSpillableAllocator(spiller: Spiller): BufferAllocator = { + if (!inSparkTask()) { + throw new IllegalStateException("Spiller must be used in a Spark task") + } + getTaskMemoryResources().createSpillableAllocator(spiller) + } + + def createSpillableMemoryPool(spiller: Spiller): NativeMemoryPool = { + if (!inSparkTask()) { + throw new IllegalStateException("Spiller must be used in a Spark task") + } + getTaskMemoryResources().createSpillableMemoryPool(spiller) + } + + def contextAllocator(): BufferAllocator = { + val globalAlloc = globalAllocator() + if (!inSparkTask()) { + return globalAlloc + } + getTaskMemoryResources().defaultAllocator + } + + def contextMemoryPool(): NativeMemoryPool = { + if (!inSparkTask()) { + return globalMemoryPool() + } + getTaskMemoryResources().defaultMemoryPool + } + + def getLeakedAllocators(): List[BufferAllocator] = { + val list = new util.ArrayList[BufferAllocator](leakedAllocators) + list.asScala.toList + } + + def getLeakedMemoryPools(): List[NativeMemoryPool] = { + val list = new util.ArrayList[NativeMemoryPool](leakedMemoryPools) + list.asScala.toList + } +} diff --git a/arrow-data-source/common/src/main/scala/org/apache/spark/sql/execution/datasources/v2/arrow/SparkSchemaUtils.scala b/arrow-data-source/common/src/main/scala/org/apache/spark/sql/execution/datasources/v2/arrow/SparkSchemaUtils.scala new file mode 100644 index 000000000..d403a62f1 --- /dev/null +++ b/arrow-data-source/common/src/main/scala/org/apache/spark/sql/execution/datasources/v2/arrow/SparkSchemaUtils.scala @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.execution.datasources.v2.arrow + +import org.apache.arrow.vector.types.pojo.Schema + +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.util.ArrowUtils + +object SparkSchemaUtils { + + def fromArrowSchema(schema: Schema): StructType = { + ArrowUtils.fromArrowSchema(schema) + } + + def toArrowSchema(schema: StructType, timeZoneId: String): Schema = { + ArrowUtils.toArrowSchema(schema, timeZoneId) + } +} diff --git a/docs/ApacheArrowInstallation.md b/arrow-data-source/docs/ApacheArrowInstallation.md similarity index 100% rename from docs/ApacheArrowInstallation.md rename to arrow-data-source/docs/ApacheArrowInstallation.md diff --git a/docs/Configuration.md b/arrow-data-source/docs/Configuration.md similarity index 100% rename from docs/Configuration.md rename to arrow-data-source/docs/Configuration.md diff --git a/docs/Installation.md b/arrow-data-source/docs/Installation.md similarity index 100% rename from docs/Installation.md rename to arrow-data-source/docs/Installation.md diff --git a/docs/InstallationNotes.md b/arrow-data-source/docs/InstallationNotes.md similarity index 100% rename from docs/InstallationNotes.md rename to arrow-data-source/docs/InstallationNotes.md diff --git a/docs/OAP-Developer-Guide.md b/arrow-data-source/docs/OAP-Developer-Guide.md similarity index 100% rename from docs/OAP-Developer-Guide.md rename to arrow-data-source/docs/OAP-Developer-Guide.md diff --git a/docs/OAP-Installation-Guide.md b/arrow-data-source/docs/OAP-Installation-Guide.md similarity index 100% rename from docs/OAP-Installation-Guide.md rename to arrow-data-source/docs/OAP-Installation-Guide.md diff --git a/docs/Prerequisite.md b/arrow-data-source/docs/Prerequisite.md similarity index 100% rename from docs/Prerequisite.md rename to arrow-data-source/docs/Prerequisite.md diff --git a/docs/SparkInstallation.md b/arrow-data-source/docs/SparkInstallation.md similarity index 100% rename from docs/SparkInstallation.md rename to arrow-data-source/docs/SparkInstallation.md diff --git a/docs/User-Guide.md b/arrow-data-source/docs/User-Guide.md similarity index 100% rename from docs/User-Guide.md rename to arrow-data-source/docs/User-Guide.md diff --git a/arrow-data-source/docs/image/arrowdatasource_validation.png b/arrow-data-source/docs/image/arrowdatasource_validation.png new file mode 100644 index 0000000000000000000000000000000000000000..c7583511a44a8cb785581bdd8191362572e3606c GIT binary patch literal 47609 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 HOrHD))^@>| literal 0 HcmV?d00001 diff --git a/docs/image/columnar.png b/arrow-data-source/docs/image/columnar.png similarity index 100% rename from docs/image/columnar.png rename to arrow-data-source/docs/image/columnar.png diff --git a/docs/image/core_arch.jpg b/arrow-data-source/docs/image/core_arch.jpg similarity index 100% rename from docs/image/core_arch.jpg rename to arrow-data-source/docs/image/core_arch.jpg diff --git a/docs/image/dataset.png b/arrow-data-source/docs/image/dataset.png similarity index 100% rename from docs/image/dataset.png rename to arrow-data-source/docs/image/dataset.png diff --git a/docs/image/decision_support_bench1_result_by_query.png b/arrow-data-source/docs/image/decision_support_bench1_result_by_query.png similarity index 100% rename from docs/image/decision_support_bench1_result_by_query.png rename to arrow-data-source/docs/image/decision_support_bench1_result_by_query.png diff --git a/docs/image/decision_support_bench1_result_in_total.png b/arrow-data-source/docs/image/decision_support_bench1_result_in_total.png similarity index 100% rename from docs/image/decision_support_bench1_result_in_total.png rename to arrow-data-source/docs/image/decision_support_bench1_result_in_total.png diff --git a/docs/image/decision_support_bench2_result_by_query.png b/arrow-data-source/docs/image/decision_support_bench2_result_by_query.png similarity index 100% rename from docs/image/decision_support_bench2_result_by_query.png rename to arrow-data-source/docs/image/decision_support_bench2_result_by_query.png diff --git a/docs/image/decision_support_bench2_result_in_total.png b/arrow-data-source/docs/image/decision_support_bench2_result_in_total.png similarity index 100% rename from docs/image/decision_support_bench2_result_in_total.png rename to arrow-data-source/docs/image/decision_support_bench2_result_in_total.png diff --git a/docs/image/kernel.png b/arrow-data-source/docs/image/kernel.png similarity index 100% rename from docs/image/kernel.png rename to arrow-data-source/docs/image/kernel.png diff --git a/docs/image/nativesql_arch.png b/arrow-data-source/docs/image/nativesql_arch.png similarity index 100% rename from docs/image/nativesql_arch.png rename to arrow-data-source/docs/image/nativesql_arch.png diff --git a/docs/image/performance.png b/arrow-data-source/docs/image/performance.png similarity index 100% rename from docs/image/performance.png rename to arrow-data-source/docs/image/performance.png diff --git a/docs/image/shuffle.png b/arrow-data-source/docs/image/shuffle.png similarity index 100% rename from docs/image/shuffle.png rename to arrow-data-source/docs/image/shuffle.png diff --git a/docs/index.md b/arrow-data-source/docs/index.md similarity index 100% rename from docs/index.md rename to arrow-data-source/docs/index.md diff --git a/arrow-data-source/mkdocs.yml b/arrow-data-source/mkdocs.yml new file mode 100644 index 000000000..8be4217d1 --- /dev/null +++ b/arrow-data-source/mkdocs.yml @@ -0,0 +1,23 @@ +site_name: Arrow Data Source + +repo_name: 'Fork on GitHub ' +repo_url: "https://github.com/oap-project/arrow-data-source.git" +edit_uri: "" + + +nav: +- User Guide: User-Guide.md +- OAP Installation Guide: OAP-Installation-Guide.md +- OAP Developer Guide: OAP-Developer-Guide.md +- Version Selector: "../" + + + +theme: readthedocs + + +plugins: + - search + - mkdocs-versioning: + version: master + exclude_from_nav: ["image", "js", "css", "fonts", "img"] diff --git a/arrow-data-source/parquet/pom.xml b/arrow-data-source/parquet/pom.xml new file mode 100644 index 000000000..eb31a59cb --- /dev/null +++ b/arrow-data-source/parquet/pom.xml @@ -0,0 +1,27 @@ + + + + spark-arrow-datasource + com.intel.oap + 1.1.0 + + 4.0.0 + + spark-arrow-datasource-parquet + + + ${project.basedir}/src/main/scala + ${project.basedir}/src/test/scala + + + + + com.intel.oap + spark-arrow-datasource-standard + ${project.version} + + + + diff --git a/arrow-data-source/parquet/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/parquet/ServiceLoaderUtil.scala b/arrow-data-source/parquet/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/parquet/ServiceLoaderUtil.scala new file mode 100644 index 000000000..001b1c26c --- /dev/null +++ b/arrow-data-source/parquet/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/parquet/ServiceLoaderUtil.scala @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.parquet + +import java.util.Objects + +import org.apache.spark.sql.execution.datasources.parquet.{ParquetFileFormat, ParquetFileFormatIndicator} + +object ServiceLoaderUtil { + def ensureParquetFileFormatOverwritten(): Unit = { + val fmt = new ParquetFileFormat() + if (!Objects.equals(fmt.toString(), ParquetFileFormatIndicator.OVERWRITTEN_INDICATOR)) { + throw new ClassNotFoundException("ParquetFileFormat is not overwritten by Arrow. Consider " + + "reordering jar dependencies to let the overwritten version to be recognized by JVM") + } + } +} diff --git a/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormat.scala b/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormat.scala new file mode 100644 index 000000000..bdf3166b1 --- /dev/null +++ b/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormat.scala @@ -0,0 +1,478 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.execution.datasources.parquet + +import java.io.IOException +import java.net.URI + +import scala.collection.JavaConverters._ +import scala.util.{Failure, Try} + +import com.intel.oap.spark.sql.execution.datasources.arrow.ArrowFileFormat +import org.apache.hadoop.conf.Configuration +import org.apache.hadoop.fs.{FileStatus, Path} +import org.apache.hadoop.mapreduce.{Job, JobID, OutputCommitter, TaskAttemptContext, TaskAttemptID, TaskID, TaskType} +import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl +import org.apache.parquet.filter2.compat.FilterCompat +import org.apache.parquet.filter2.predicate.FilterApi +import org.apache.parquet.format.converter.ParquetMetadataConverter.SKIP_ROW_GROUPS +import org.apache.parquet.hadoop.{Footer, ParquetFileReader, ParquetInputFormat, ParquetOutputCommitter, ParquetOutputFormat, ParquetRecordReader} +import org.apache.parquet.hadoop.ParquetOutputFormat.JobSummaryLevel +import org.apache.parquet.hadoop.codec.CodecConfig +import org.apache.parquet.hadoop.util.ContextUtil +import org.apache.parquet.schema.MessageType + +import org.apache.spark.TaskContext +import org.apache.spark.internal.Logging +import org.apache.spark.sql.{Row, SparkSession} +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.catalyst.expressions.JoinedRow +import org.apache.spark.sql.catalyst.expressions.codegen.GenerateUnsafeProjection +import org.apache.spark.sql.catalyst.parser.LegacyTypeStringParser +import org.apache.spark.sql.catalyst.util.DateTimeUtils +import org.apache.spark.sql.execution.datasources.{DataSourceUtils, OutputWriter, OutputWriterFactory, PartitionedFile, RecordReaderIterator, SchemaMergeUtils} +import org.apache.spark.sql.execution.datasources.parquet.ParquetSQLConf._ +import org.apache.spark.sql.execution.vectorized.{OffHeapColumnVector, OnHeapColumnVector} +import org.apache.spark.sql.internal.SQLConf +import org.apache.spark.sql.sources.{DataSourceRegister, Filter} +import org.apache.spark.sql.types.{ArrayType, AtomicType, DataType, MapType, StructType, UserDefinedType} +import org.apache.spark.util.{SerializableConfiguration, ThreadUtils} + +/** + * This is expected to overwrite built-in ParquetFileFormat. Read is redirected to ArrowFileFormat's + * read. + */ +class ParquetFileFormat + extends ArrowFileFormat + with DataSourceRegister + with Logging + with Serializable { + + override def shortName(): String = "parquet" + + override def toString: String = ParquetFileFormatIndicator.OVERWRITTEN_INDICATOR + + override def hashCode(): Int = getClass.hashCode() + + override def equals(other: Any): Boolean = other.isInstanceOf[ParquetFileFormat] + + /** + * We copy following codes from Spark's built-in ParquetFileFormat. It's not suggested to + * change any of the logic to make sure we are on the same boat with Spark when it comes + * to Parquet write. + */ + override def prepareWrite(sparkSession: SparkSession, + job: Job, + options: Map[String, String], + dataSchema: StructType): OutputWriterFactory = { + val parquetOptions = new ParquetOptions(options, sparkSession.sessionState.conf) + + val conf = ContextUtil.getConfiguration(job) + + val committerClass = + conf.getClass( + SQLConf.PARQUET_OUTPUT_COMMITTER_CLASS.key, + classOf[ParquetOutputCommitter], + classOf[OutputCommitter]) + + if (conf.get(SQLConf.PARQUET_OUTPUT_COMMITTER_CLASS.key) == null) { + logInfo("Using default output committer for Parquet: " + + classOf[ParquetOutputCommitter].getCanonicalName) + } else { + logInfo("Using user defined output committer for Parquet: " + committerClass.getCanonicalName) + } + + conf.setClass( + SQLConf.OUTPUT_COMMITTER_CLASS.key, + committerClass, + classOf[OutputCommitter]) + + // We're not really using `ParquetOutputFormat[Row]` for writing data here, because we override + // it in `ParquetOutputWriter` to support appending and dynamic partitioning. The reason why + // we set it here is to setup the output committer class to `ParquetOutputCommitter`, which is + // bundled with `ParquetOutputFormat[Row]`. + job.setOutputFormatClass(classOf[ParquetOutputFormat[Row]]) + + ParquetOutputFormat.setWriteSupportClass(job, classOf[ParquetWriteSupport]) + + // This metadata is useful for keeping UDTs like Vector/Matrix. + ParquetWriteSupport.setSchema(dataSchema, conf) + + // Sets flags for `ParquetWriteSupport`, which converts Catalyst schema to Parquet + // schema and writes actual rows to Parquet files. + conf.set( + SQLConf.PARQUET_WRITE_LEGACY_FORMAT.key, + sparkSession.sessionState.conf.writeLegacyParquetFormat.toString) + + conf.set( + SQLConf.PARQUET_OUTPUT_TIMESTAMP_TYPE.key, + sparkSession.sessionState.conf.parquetOutputTimestampType.toString) + + // Sets compression scheme + conf.set(ParquetOutputFormat.COMPRESSION, parquetOptions.compressionCodecClassName) + + // SPARK-15719: Disables writing Parquet summary files by default. + if (conf.get(ParquetOutputFormat.JOB_SUMMARY_LEVEL) == null + && conf.get(ParquetOutputFormat.ENABLE_JOB_SUMMARY) == null) { + conf.setEnum(ParquetOutputFormat.JOB_SUMMARY_LEVEL, JobSummaryLevel.NONE) + } + + if (ParquetOutputFormat.getJobSummaryLevel(conf) != JobSummaryLevel.NONE + && !classOf[ParquetOutputCommitter].isAssignableFrom(committerClass)) { + // output summary is requested, but the class is not a Parquet Committer + logWarning(s"Committer $committerClass is not a ParquetOutputCommitter and cannot" + + s" create job summaries. " + + s"Set Parquet option ${ParquetOutputFormat.JOB_SUMMARY_LEVEL} to NONE.") + } + + new OutputWriterFactory { + // This OutputWriterFactory instance is deserialized when writing Parquet files on the + // executor side without constructing or deserializing ParquetFileFormat. Therefore, we hold + // another reference to ParquetLogRedirector.INSTANCE here to ensure the latter class is + // initialized. + private val parquetLogRedirector = ParquetLogRedirector.INSTANCE + + override def newInstance( + path: String, + dataSchema: StructType, + context: TaskAttemptContext): OutputWriter = { + new ParquetOutputWriter(path, context) + } + + override def getFileExtension(context: TaskAttemptContext): String = { + CodecConfig.from(context).getCodec.getExtension + ".parquet" + } + } + } + + override def inferSchema(sparkSession: SparkSession, + parameters: Map[String, String], + files: Seq[FileStatus]): Option[StructType] = { + val overwrite = sparkSession.sqlContext.conf.overwriteParquetDataSourceRead + if (overwrite) { + return super.inferSchema(sparkSession, parameters, files) + } + ParquetUtils.inferSchema(sparkSession, parameters, files) + } + + /** + * Returns whether the reader will return the rows as batch or not. + */ + override def supportBatch(sparkSession: SparkSession, schema: StructType): Boolean = { + val conf = sparkSession.sessionState.conf + val overwrite = sparkSession.sqlContext.conf.overwriteParquetDataSourceRead + if (overwrite) { + return super.supportBatch(sparkSession, schema) + } + conf.parquetVectorizedReaderEnabled && conf.wholeStageEnabled && + schema.length <= conf.wholeStageMaxNumFields && + schema.forall(_.dataType.isInstanceOf[AtomicType]) + } + + override def vectorTypes(requiredSchema: StructType, + partitionSchema: StructType, + sqlConf: SQLConf): Option[Seq[String]] = { + val overwrite = sqlConf.overwriteParquetDataSourceRead + if (overwrite) { + return super.vectorTypes(requiredSchema, partitionSchema, sqlConf) + } + Option(Seq.fill(requiredSchema.fields.length + partitionSchema.fields.length)( + if (!sqlConf.offHeapColumnVectorEnabled) { + classOf[OnHeapColumnVector].getName + } else { + classOf[OffHeapColumnVector].getName + } + )) + } + + override def isSplitable(sparkSession: SparkSession, + options: Map[String, String], + path: Path): Boolean = { + val overwrite = sparkSession.sqlContext.conf.overwriteParquetDataSourceRead + if (overwrite) { + return super.isSplitable(sparkSession, options, path) + } + true + } + + override def buildReaderWithPartitionValues(sparkSession: SparkSession, + dataSchema: StructType, + partitionSchema: StructType, + requiredSchema: StructType, + filters: Seq[Filter], + options: Map[String, String], + hadoopConf: Configuration): + (PartitionedFile) => Iterator[InternalRow] = { + val overwrite = sparkSession.sqlContext.conf.overwriteParquetDataSourceRead + if (overwrite) { + return super.buildReaderWithPartitionValues(sparkSession, dataSchema, + partitionSchema, requiredSchema, filters, options, hadoopConf) + } + hadoopConf.set(ParquetInputFormat.READ_SUPPORT_CLASS, classOf[ParquetReadSupport].getName) + hadoopConf.set( + ParquetReadSupport.SPARK_ROW_REQUESTED_SCHEMA, + requiredSchema.json) + hadoopConf.set( + ParquetWriteSupport.SPARK_ROW_SCHEMA, + requiredSchema.json) + hadoopConf.set( + SQLConf.SESSION_LOCAL_TIMEZONE.key, + sparkSession.sessionState.conf.sessionLocalTimeZone) + hadoopConf.setBoolean( + SQLConf.NESTED_SCHEMA_PRUNING_ENABLED.key, + sparkSession.sessionState.conf.nestedSchemaPruningEnabled) + hadoopConf.setBoolean( + SQLConf.CASE_SENSITIVE.key, + sparkSession.sessionState.conf.caseSensitiveAnalysis) + + ParquetWriteSupport.setSchema(requiredSchema, hadoopConf) + + // Sets flags for `ParquetToSparkSchemaConverter` + hadoopConf.setBoolean( + SQLConf.PARQUET_BINARY_AS_STRING.key, + sparkSession.sessionState.conf.isParquetBinaryAsString) + hadoopConf.setBoolean( + SQLConf.PARQUET_INT96_AS_TIMESTAMP.key, + sparkSession.sessionState.conf.isParquetINT96AsTimestamp) + + val broadcastedHadoopConf = + sparkSession.sparkContext.broadcast(new SerializableConfiguration(hadoopConf)) + + // TODO: if you move this into the closure it reverts to the default values. + // If true, enable using the custom RecordReader for parquet. This only works for + // a subset of the types (no complex types). + val resultSchema = StructType(partitionSchema.fields ++ requiredSchema.fields) + val sqlConf = sparkSession.sessionState.conf + val enableOffHeapColumnVector = sqlConf.offHeapColumnVectorEnabled + val enableVectorizedReader: Boolean = + sqlConf.parquetVectorizedReaderEnabled && + resultSchema.forall(_.dataType.isInstanceOf[AtomicType]) + val enableRecordFilter: Boolean = sqlConf.parquetRecordFilterEnabled + val timestampConversion: Boolean = sqlConf.isParquetINT96TimestampConversion + val capacity = sqlConf.parquetVectorizedReaderBatchSize + val enableParquetFilterPushDown: Boolean = sqlConf.parquetFilterPushDown + // Whole stage codegen (PhysicalRDD) is able to deal with batches directly + val returningBatch = supportBatch(sparkSession, resultSchema) + val pushDownDate = sqlConf.parquetFilterPushDownDate + val pushDownTimestamp = sqlConf.parquetFilterPushDownTimestamp + val pushDownDecimal = sqlConf.parquetFilterPushDownDecimal + val pushDownStringStartWith = sqlConf.parquetFilterPushDownStringStartWith + val pushDownInFilterThreshold = sqlConf.parquetFilterPushDownInFilterThreshold + val isCaseSensitive = sqlConf.caseSensitiveAnalysis + + (file: PartitionedFile) => { + assert(file.partitionValues.numFields == partitionSchema.size) + + val filePath = new Path(new URI(file.filePath)) + val split = + new org.apache.parquet.hadoop.ParquetInputSplit( + filePath, + file.start, + file.start + file.length, + file.length, + Array.empty, + null) + + val sharedConf = broadcastedHadoopConf.value.value + + lazy val footerFileMetaData = + ParquetFileReader.readFooter(sharedConf, filePath, SKIP_ROW_GROUPS).getFileMetaData + // Try to push down filters when filter push-down is enabled. + val pushed = if (enableParquetFilterPushDown) { + val parquetSchema = footerFileMetaData.getSchema + val parquetFilters = new ParquetFilters(parquetSchema, pushDownDate, pushDownTimestamp, + pushDownDecimal, pushDownStringStartWith, pushDownInFilterThreshold, isCaseSensitive) + filters + // Collects all converted Parquet filter predicates. Notice that not all predicates can be + // converted (`ParquetFilters.createFilter` returns an `Option`). That's why a `flatMap` + // is used here. + .flatMap(parquetFilters.createFilter(_)) + .reduceOption(FilterApi.and) + } else { + None + } + + // PARQUET_INT96_TIMESTAMP_CONVERSION says to apply timezone conversions to int96 timestamps' + // *only* if the file was created by something other than "parquet-mr", so check the actual + // writer here for this file. We have to do this per-file, as each file in the table may + // have different writers. + // Define isCreatedByParquetMr as function to avoid unnecessary parquet footer reads. + def isCreatedByParquetMr: Boolean = + footerFileMetaData.getCreatedBy().startsWith("parquet-mr") + + val convertTz = + if (timestampConversion && !isCreatedByParquetMr) { + Some(DateTimeUtils.getZoneId(sharedConf.get(SQLConf.SESSION_LOCAL_TIMEZONE.key))) + } else { + None + } + + val datetimeRebaseMode = DataSourceUtils.datetimeRebaseMode( + footerFileMetaData.getKeyValueMetaData.get, + SQLConf.get.getConf(SQLConf.LEGACY_PARQUET_REBASE_MODE_IN_READ)) + + val attemptId = new TaskAttemptID(new TaskID(new JobID(), TaskType.MAP, 0), 0) + val hadoopAttemptContext = + new TaskAttemptContextImpl(broadcastedHadoopConf.value.value, attemptId) + + // Try to push down filters when filter push-down is enabled. + // Notice: This push-down is RowGroups level, not individual records. + if (pushed.isDefined) { + ParquetInputFormat.setFilterPredicate(hadoopAttemptContext.getConfiguration, pushed.get) + } + val taskContext = Option(TaskContext.get()) + if (enableVectorizedReader) { + val vectorizedReader = new VectorizedParquetRecordReader( + convertTz.orNull, + datetimeRebaseMode.toString, + enableOffHeapColumnVector && taskContext.isDefined, + capacity) + val iter = new RecordReaderIterator(vectorizedReader) + // SPARK-23457 Register a task completion listener before `initialization`. + taskContext.foreach(_.addTaskCompletionListener[Unit](_ => iter.close())) + vectorizedReader.initialize(split, hadoopAttemptContext) + logDebug(s"Appending $partitionSchema ${file.partitionValues}") + vectorizedReader.initBatch(partitionSchema, file.partitionValues) + if (returningBatch) { + vectorizedReader.enableReturningBatches() + } + + // UnsafeRowParquetRecordReader appends the columns internally to avoid another copy. + iter.asInstanceOf[Iterator[InternalRow]] + } else { + logDebug(s"Falling back to parquet-mr") + // ParquetRecordReader returns InternalRow + val readSupport = new ParquetReadSupport( + convertTz, enableVectorizedReader = false, datetimeRebaseMode) + val reader = if (pushed.isDefined && enableRecordFilter) { + val parquetFilter = FilterCompat.get(pushed.get, null) + new ParquetRecordReader[InternalRow](readSupport, parquetFilter) + } else { + new ParquetRecordReader[InternalRow](readSupport) + } + val iter = new RecordReaderIterator[InternalRow](reader) + // SPARK-23457 Register a task completion listener before `initialization`. + taskContext.foreach(_.addTaskCompletionListener[Unit](_ => iter.close())) + reader.initialize(split, hadoopAttemptContext) + + val fullSchema = requiredSchema.toAttributes ++ partitionSchema.toAttributes + val unsafeProjection = GenerateUnsafeProjection.generate(fullSchema, fullSchema) + + if (partitionSchema.length == 0) { + // There is no partition columns + iter.map(unsafeProjection) + } else { + val joinedRow = new JoinedRow() + iter.map(d => unsafeProjection(joinedRow(d, file.partitionValues))) + } + } + } + } + + override def supportDataType(dataType: DataType): Boolean = dataType match { + case _: AtomicType => true + + case st: StructType => st.forall { f => supportDataType(f.dataType) } + + case ArrayType(elementType, _) => supportDataType(elementType) + + case MapType(keyType, valueType, _) => + supportDataType(keyType) && supportDataType(valueType) + + case udt: UserDefinedType[_] => supportDataType(udt.sqlType) + + case _ => false + } +} + +object ParquetFileFormat extends Logging { + /** + * Reads Spark SQL schema from a Parquet footer. If a valid serialized Spark SQL schema string + * can be found in the file metadata, returns the deserialized [[StructType]], otherwise, returns + * a [[StructType]] converted from the [[MessageType]] stored in this footer. + */ + def readSchemaFromFooter(footer: Footer, converter: ParquetToSparkSchemaConverter): StructType = { + val fileMetaData = footer.getParquetMetadata.getFileMetaData + fileMetaData + .getKeyValueMetaData + .asScala.toMap + .get(ParquetReadSupport.SPARK_METADATA_KEY) + .flatMap(deserializeSchemaString) + .getOrElse(converter.convert(fileMetaData.getSchema)) + } + + private def deserializeSchemaString(schemaString: String): Option[StructType] = { + // Tries to deserialize the schema string as JSON first, then falls back to the case class + // string parser (data generated by older versions of Spark SQL uses this format). + Try(DataType.fromJson(schemaString).asInstanceOf[StructType]).recover { + case _: Throwable => + logInfo( + "Serialized Spark schema in Parquet key-value metadata is not in JSON format, " + + "falling back to the deprecated DataType.fromCaseClassString parser.") + LegacyTypeStringParser.parseString(schemaString).asInstanceOf[StructType] + }.recoverWith { + case cause: Throwable => + logWarning( + "Failed to parse and ignored serialized Spark schema in " + + s"Parquet key-value metadata:\n\t$schemaString", cause) + Failure(cause) + }.toOption + } + + def mergeSchemasInParallel( + filesToTouch: Seq[FileStatus], + sparkSession: SparkSession): Option[StructType] = { + val assumeBinaryIsString = sparkSession.sessionState.conf.isParquetBinaryAsString + val assumeInt96IsTimestamp = sparkSession.sessionState.conf.isParquetINT96AsTimestamp + + val reader = (files: Seq[FileStatus], conf: Configuration, ignoreCorruptFiles: Boolean) => { + // Converter used to convert Parquet `MessageType` to Spark SQL `StructType` + val converter = new ParquetToSparkSchemaConverter( + assumeBinaryIsString = assumeBinaryIsString, + assumeInt96IsTimestamp = assumeInt96IsTimestamp) + + readParquetFootersInParallel(conf, files, ignoreCorruptFiles) + .map(ParquetFileFormat.readSchemaFromFooter(_, converter)) + } + + SchemaMergeUtils.mergeSchemasInParallel(sparkSession, filesToTouch, reader) + } + + private[parquet] def readParquetFootersInParallel( + conf: Configuration, + partFiles: Seq[FileStatus], + ignoreCorruptFiles: Boolean): Seq[Footer] = { + ThreadUtils.parmap(partFiles, "readingParquetFooters", 8) { currentFile => + try { + // Skips row group information since we only need the schema. + // ParquetFileReader.readFooter throws RuntimeException, instead of IOException, + // when it can't read the footer. + Some(new Footer(currentFile.getPath(), + ParquetFileReader.readFooter( + conf, currentFile, SKIP_ROW_GROUPS))) + } catch { case e: RuntimeException => + if (ignoreCorruptFiles) { + logWarning(s"Skipped the footer in the corrupted file: $currentFile", e) + None + } else { + throw new IOException(s"Could not read footer for file: $currentFile", e) + } + } + }.flatten + } +} diff --git a/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatIndicator.scala b/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatIndicator.scala new file mode 100644 index 000000000..29aa38069 --- /dev/null +++ b/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatIndicator.scala @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.execution.datasources.parquet + +object ParquetFileFormatIndicator { + val OVERWRITTEN_INDICATOR = "Parquet-Overwritten-By-Arrow" +} diff --git a/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSQLConf.scala b/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSQLConf.scala new file mode 100644 index 000000000..9e3096189 --- /dev/null +++ b/arrow-data-source/parquet/src/main/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSQLConf.scala @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.sql.execution.datasources.parquet + +import org.apache.spark.sql.internal.SQLConf + +object ParquetSQLConf { + // We default this option value to TRUE. This is because once the code is executed, the compiled + // arrow-datasource-parquet.jar file is supposed to be placed into Spark's lib folder. Which + // means it's user's intention to use the replaced ParquetDataSource. + val OVERWRITE_PARQUET_DATASOURCE_READ = + SQLConf.buildConf("spark.sql.arrow.overwrite.parquet.read") + .doc("Overwrite Parquet datasource v1 with reader of Arrow datasource.") + .booleanConf + .createWithDefault(true) + + implicit def fromSQLConf(c: SQLConf): ParquetSQLConf = { + new ParquetSQLConf(c) + } +} + +class ParquetSQLConf(c: SQLConf) { + def overwriteParquetDataSourceRead: Boolean = + c.getConf(ParquetSQLConf.OVERWRITE_PARQUET_DATASOURCE_READ) +} diff --git a/arrow-data-source/parquet/src/test/scala/com/intel/oap/spark/sql/execution/datasources/v2/parquet/ParquetFileFormatTest.scala b/arrow-data-source/parquet/src/test/scala/com/intel/oap/spark/sql/execution/datasources/v2/parquet/ParquetFileFormatTest.scala new file mode 100644 index 000000000..84e0fc410 --- /dev/null +++ b/arrow-data-source/parquet/src/test/scala/com/intel/oap/spark/sql/execution/datasources/v2/parquet/ParquetFileFormatTest.scala @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intel.oap.spark.sql.execution.datasources.v2.parquet + +import java.io.File + +import com.intel.oap.vectorized.ArrowWritableColumnVector + +import org.apache.spark.SparkConf +import org.apache.spark.sql.QueryTest +import org.apache.spark.sql.execution.FileSourceScanExec +import org.apache.spark.sql.execution.datasources.parquet.ParquetSQLConf +import org.apache.spark.sql.execution.datasources.v2.arrow.SparkMemoryUtils +import org.apache.spark.sql.test.SharedSparkSession + +class ParquetFileFormatTest extends QueryTest with SharedSparkSession { + + private val parquetFile1 = "parquet-1.parquet" + + override protected def sparkConf: SparkConf = { + val conf = super.sparkConf + conf.set("spark.memory.offHeap.size", String.valueOf(256 * 1024 * 1024)) + conf + } + + def closeAllocators(): Unit = { + SparkMemoryUtils.contextAllocator().close() + } + + test("overwrite write only") { + import testImplicits._ + withSQLConf(ParquetSQLConf.OVERWRITE_PARQUET_DATASOURCE_READ.key -> "false") { + ServiceLoaderUtil.ensureParquetFileFormatOverwritten() + spark.read + .json(Seq("{\"col\": -1}", "{\"col\": 0}", "{\"col\": 1}", "{\"col\": 2}", + "{\"col\": null}") + .toDS()) + .repartition(1) + .write + .mode("overwrite") + .parquet(ParquetFileFormatTest.locateResourcePath(parquetFile1)) + val path = ParquetFileFormatTest.locateResourcePath(parquetFile1) + val frame = spark.read.parquet(path) + val eplan = frame.queryExecution.executedPlan + assert(eplan.toString + .contains("Format: Parquet-Overwritten-By-Arrow")) + val scan = eplan.find(_.isInstanceOf[FileSourceScanExec]).get + val typeAssertions = scan.executeColumnar() + .flatMap(b => (0 until b.numCols()).map(b.column(_))) + .map(!_.isInstanceOf[ArrowWritableColumnVector]) + .collect() + assert(typeAssertions.forall(p => p)) + } + } + + test("overwrite read and write") { + import testImplicits._ + ServiceLoaderUtil.ensureParquetFileFormatOverwritten() + spark.read + .json(Seq("{\"col\": -1}", "{\"col\": 0}", "{\"col\": 1}", "{\"col\": 2}", "{\"col\": null}") + .toDS()) + .repartition(1) + .write + .mode("overwrite") + .parquet(ParquetFileFormatTest.locateResourcePath(parquetFile1)) + val path = ParquetFileFormatTest.locateResourcePath(parquetFile1) + val frame = spark.read.parquet(path) + val eplan = frame.queryExecution.executedPlan + assert(eplan.toString + .contains("Format: Parquet-Overwritten-By-Arrow")) + val scan = eplan.find(_.isInstanceOf[FileSourceScanExec]).get + val typeAssertions = scan.executeColumnar() + .flatMap(b => (0 until b.numCols()).map(b.column(_))) + .map(_.isInstanceOf[ArrowWritableColumnVector]) + .collect() + assert(typeAssertions.forall(p => p)) + } +} + +object ParquetFileFormatTest { + private def locateResourcePath(resource: String): String = { + classOf[ParquetFileFormatTest].getClassLoader.getResource("") + .getPath.concat(File.separator).concat(resource) + } +} diff --git a/arrow-data-source/pom.xml b/arrow-data-source/pom.xml new file mode 100644 index 000000000..267f3cced --- /dev/null +++ b/arrow-data-source/pom.xml @@ -0,0 +1,182 @@ + + 4.0.0 + + + com.intel.oap + spark-arrow-datasource + OAP Project Spark Arrow Datasource + pom + 1.1.0 + 2008 + + common + standard + parquet + + + 2.12.10 + 2.12 + 3.0.0 + 3.0.0 + UTF-8 + UTF-8 + + + + + scala-tools.org + Scala-Tools Maven2 Repository + http://scala-tools.org/repo-releases + + + + + + scala-tools.org + Scala-Tools Maven2 Repository + http://scala-tools.org/repo-releases + + + + + + org.apache.arrow + arrow-memory-netty + ${arrow.version} + + + org.apache.arrow + arrow-dataset + ${arrow.version} + + + io.netty + netty-common + + + io.netty + netty-buffer + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-annotations + + + compile + + + org.scala-lang + scala-library + ${scala.version} + provided + + + org.apache.spark + spark-sql_2.12 + ${spark.version} + + + org.apache.arrow + arrow-format + + + provided + + + junit + junit + 4.4 + test + + + org.apache.spark + spark-core_2.12 + ${spark.version} + test-jar + test + + + org.apache.spark + spark-catalyst_2.12 + ${spark.version} + test-jar + test + + + org.apache.spark + spark-sql_2.12 + ${spark.version} + test-jar + test + + + org.scalatest + scalatest_${scala.binary.version} + 3.0.5 + test + + + + + + + org.scalatest + scalatest-maven-plugin + + + + test + + + + + + org.scala-tools + maven-scala-plugin + + + + compile + testCompile + + process-sources + + + + ${scala.version} + + -target:jvm-1.5 + + + + + org.scalastyle + scalastyle-maven-plugin + 1.0.0 + + false + true + false + false + ${project.basedir}/src/main/scala + ${project.basedir}/src/test/scala + ${user.dir}/scalastyle-config.xml + ${project.basedir}/target/scalastyle-output.xml + ${project.build.sourceEncoding} + ${project.reporting.outputEncoding} + + + + + check + + + + + + + diff --git a/arrow-data-source/resource/arrowdatasource_validation.png b/arrow-data-source/resource/arrowdatasource_validation.png new file mode 100644 index 0000000000000000000000000000000000000000..c7583511a44a8cb785581bdd8191362572e3606c GIT binary patch literal 47609 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 HOrHD))^@>| literal 0 HcmV?d00001 diff --git a/arrow-data-source/standard/pom.xml b/arrow-data-source/standard/pom.xml new file mode 100644 index 000000000..b5b8b29e6 --- /dev/null +++ b/arrow-data-source/standard/pom.xml @@ -0,0 +1,105 @@ + + + + spark-arrow-datasource + com.intel.oap + 1.1.0 + + 4.0.0 + + spark-arrow-datasource-standard + + + + + com.intel.oap + spark-arrow-datasource-common + ${project.version} + + + + + ${project.basedir}/src/main/scala + ${project.basedir}/src/test/scala + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + compile + + compile + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-src-1 + generate-sources + + add-source + + + + ${project.basedir}/src/main/java + + + + + + + maven-assembly-plugin + 3.0.0 + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + + + + + org.scala-tools + maven-scala-plugin + + ${scala.version} + + + + + diff --git a/arrow-data-source/standard/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/arrow-data-source/standard/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister new file mode 100644 index 000000000..dfdfbba20 --- /dev/null +++ b/arrow-data-source/standard/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister @@ -0,0 +1 @@ +com.intel.oap.spark.sql.execution.datasources.v2.arrow.ArrowDataSourceV2 \ No newline at end of file diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/DataFrameReaderImplicits.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/DataFrameReaderImplicits.scala new file mode 100644 index 000000000..ee3b5f291 --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/DataFrameReaderImplicits.scala @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql + +import org.apache.spark.sql.{DataFrame, DataFrameReader} + +class DataFrameReaderImplicits(r: DataFrameReader) { + + /** + * Loads a file via Arrow Datasets API and returns the result as a `DataFrame`. + * + * @param path input path + * @since 3.0.0-SNAPSHOT + */ + def arrow(path: String): DataFrame = { + // This method ensures that calls that explicit need single argument works, see SPARK-16009 + arrow(Seq(path): _*) + } + + /** + * Loads files via Arrow Datasets API and returns the result as a `DataFrame`. + * + * @param paths input paths + * @since 3.0.0-SNAPSHOT + */ + @scala.annotation.varargs + def arrow(paths: String*): DataFrame = r.format("arrow").load(paths: _*) +} + +object DataFrameReaderImplicits { + implicit def readerConverter(r: DataFrameReader): DataFrameReaderImplicits = { + new DataFrameReaderImplicits(r) + } +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowFileFormat.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowFileFormat.scala new file mode 100644 index 000000000..61122592d --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowFileFormat.scala @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.arrow + +import java.net.URLDecoder + +import scala.collection.JavaConverters._ + +import com.intel.oap.spark.sql.execution.datasources.arrow.ArrowFileFormat.UnsafeItr +import com.intel.oap.spark.sql.execution.datasources.v2.arrow.{ArrowFilters, ArrowOptions, ArrowUtils} +import com.intel.oap.spark.sql.execution.datasources.v2.arrow.ArrowSQLConf._ +import com.intel.oap.vectorized.ArrowWritableColumnVector +import org.apache.arrow.dataset.scanner.ScanOptions +import org.apache.hadoop.conf.Configuration +import org.apache.hadoop.fs.{FileStatus, Path} +import org.apache.hadoop.mapreduce.Job + +import org.apache.spark.TaskContext +import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.execution.datasources.{FileFormat, OutputWriterFactory, PartitionedFile} +import org.apache.spark.sql.internal.SQLConf +import org.apache.spark.sql.sources.{DataSourceRegister, Filter} +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.util.CaseInsensitiveStringMap +import org.apache.spark.sql.vectorized.ColumnarBatch; + +class ArrowFileFormat extends FileFormat with DataSourceRegister with Serializable { + + + override def isSplitable(sparkSession: SparkSession, + options: Map[String, String], path: Path): Boolean = { + ArrowUtils.isOriginalFormatSplitable( + new ArrowOptions(new CaseInsensitiveStringMap(options.asJava).asScala.toMap)) + } + + def convert(files: Seq[FileStatus], options: Map[String, String]): Option[StructType] = { + ArrowUtils.readSchema(files, new CaseInsensitiveStringMap(options.asJava)) + } + + override def inferSchema( + sparkSession: SparkSession, + options: Map[String, String], + files: Seq[FileStatus]): Option[StructType] = { + convert(files, options) + } + + override def prepareWrite( + sparkSession: SparkSession, + job: Job, + options: Map[String, String], + dataSchema: StructType): OutputWriterFactory = { + throw new UnsupportedOperationException("Write is not supported for Arrow source") + } + + override def supportBatch(sparkSession: SparkSession, dataSchema: StructType): Boolean = true + + override def buildReaderWithPartitionValues(sparkSession: SparkSession, + dataSchema: StructType, + partitionSchema: StructType, + requiredSchema: StructType, + filters: Seq[Filter], + options: Map[String, String], + hadoopConf: Configuration): PartitionedFile => Iterator[InternalRow] = { + val sqlConf = sparkSession.sessionState.conf; + val batchSize = sqlConf.parquetVectorizedReaderBatchSize + val enableFilterPushDown = sqlConf.arrowFilterPushDown + + (file: PartitionedFile) => { + val factory = ArrowUtils.makeArrowDiscovery( + URLDecoder.decode(file.filePath, "UTF-8"), file.start, file.length, + new ArrowOptions( + new CaseInsensitiveStringMap( + options.asJava).asScala.toMap)) + + // todo predicate validation / pushdown + val dataset = factory.finish(); + + val filter = if (enableFilterPushDown) { + ArrowFilters.translateFilters(filters) + } else { + org.apache.arrow.dataset.filter.Filter.EMPTY + } + + val scanOptions = new ScanOptions(requiredSchema.map(f => f.name).toArray, + filter, batchSize) + val scanner = dataset.newScan(scanOptions) + + val taskList = scanner + .scan() + .iterator() + .asScala + .toList + val itrList = taskList + .map(task => task.scan()) + + Option(TaskContext.get()).foreach(_.addTaskCompletionListener[Unit](_ => { + itrList.foreach(_.close()) + taskList.foreach(_.close()) + scanner.close() + dataset.close() + factory.close() + })) + + val itr = itrList + .toIterator + .flatMap(itr => itr.asScala) + .map(vsr => ArrowUtils.loadVectors(vsr, file.partitionValues, partitionSchema, + requiredSchema)) + new UnsafeItr(itr).asInstanceOf[Iterator[InternalRow]] + } + } + + override def vectorTypes(requiredSchema: StructType, partitionSchema: StructType, + sqlConf: SQLConf): Option[Seq[String]] = { + Option(Seq.fill(requiredSchema.fields.length + partitionSchema.fields.length)( + classOf[ArrowWritableColumnVector].getName + )) + } + + override def shortName(): String = "arrow" +} + +object ArrowFileFormat { + class UnsafeItr[T](delegate: Iterator[ColumnarBatch]) + extends Iterator[ColumnarBatch] { + val holder = new ColumnarBatchRetainer() + + override def hasNext: Boolean = { + holder.release() + val hasNext = delegate.hasNext + hasNext + } + + override def next(): ColumnarBatch = { + val b = delegate.next() + holder.retain(b) + b + } + } + + class ColumnarBatchRetainer { + private var retained: Option[ColumnarBatch] = None + + def retain(batch: ColumnarBatch): Unit = { + if (retained.isDefined) { + throw new IllegalStateException + } + retained = Some(batch) + } + + def release(): Unit = { + retained.foreach(b => b.close()) + retained = None + } + } +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowDataSourceV2.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowDataSourceV2.scala new file mode 100644 index 000000000..d19446778 --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowDataSourceV2.scala @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import com.intel.oap.spark.sql.execution.datasources.arrow.ArrowFileFormat + +import org.apache.spark.sql.connector.catalog.Table +import org.apache.spark.sql.execution.datasources.FileFormat +import org.apache.spark.sql.execution.datasources.v2.FileDataSourceV2 +import org.apache.spark.sql.util.CaseInsensitiveStringMap + +class ArrowDataSourceV2 extends FileDataSourceV2 { + + private val format = classOf[ArrowFileFormat] + + override def fallbackFileFormat: Class[_ <: FileFormat] = { + format + } + + override def getTable(options: CaseInsensitiveStringMap): Table = { + val paths = getPaths(options) + val tableName = getTableName(paths) + ArrowTable(tableName, sparkSession, options, paths, None, fallbackFileFormat) + } + + override def shortName(): String = "arrow" +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowFilters.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowFilters.scala new file mode 100644 index 000000000..f33c7995a --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowFilters.scala @@ -0,0 +1,206 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import org.apache.arrow.dataset.DatasetTypes +import org.apache.arrow.dataset.DatasetTypes.TreeNode +import org.apache.arrow.dataset.filter.FilterImpl + +import org.apache.spark.sql.sources._ +import org.apache.spark.sql.types.StructType + +object ArrowFilters { + def pruneWithSchema(pushedFilters: Array[Filter], schema: StructType): Seq[Filter] = { + pushedFilters.filter(pushedFilter => { + isToBeAccepted(pushedFilter, schema) + }) + } + + private def isToBeAccepted(pushedFilter: Filter, schema: StructType): Boolean = { + pushedFilter match { + case EqualTo(attribute, value) => existsIn(attribute, schema) + case GreaterThan(attribute, value) => existsIn(attribute, schema) + case GreaterThanOrEqual(attribute, value) => existsIn(attribute, schema) + case LessThan(attribute, value) => existsIn(attribute, schema) + case LessThanOrEqual(attribute, value) => existsIn(attribute, schema) + case Not(child) => isToBeAccepted(child, schema) + case And(left, right) => isToBeAccepted(left, schema) && isToBeAccepted(right, schema) + case Or(left, right) => isToBeAccepted(left, schema) && isToBeAccepted(right, schema) + case IsNotNull(attribute) => existsIn(attribute, schema) + case IsNull(attribute) => existsIn(attribute, schema) + case _ => false // fixme complete this + } + } + + private def existsIn(attr: String, schema: StructType): Boolean = { + schema.foreach(f => { + if (f.name == attr) { + return true; + } + }) + false + } + + def translateFilters(pushedFilters: Seq[Filter]): org.apache.arrow.dataset.filter.Filter = { + val node = pushedFilters + .flatMap(translateFilter) + .reduceOption((t1: TreeNode, t2: TreeNode) => { + DatasetTypes.TreeNode.newBuilder.setAndNode( + DatasetTypes.AndNode.newBuilder() + .setLeftArg(t1) + .setRightArg(t2) + .build()).build() + }) + if (node.isDefined) { + new FilterImpl(DatasetTypes.Condition.newBuilder() + .setRoot(node.get).build) + } else { + org.apache.arrow.dataset.filter.Filter.EMPTY + } + } + + private def translateValue(value: Any): Option[TreeNode] = { + value match { + case v: Integer => Some( + DatasetTypes.TreeNode.newBuilder.setIntNode( + DatasetTypes.IntNode.newBuilder.setValue(v).build) + .build) + case v: Long => Some( + DatasetTypes.TreeNode.newBuilder.setLongNode( + DatasetTypes.LongNode.newBuilder.setValue(v).build) + .build) + case v: Float => Some( + DatasetTypes.TreeNode.newBuilder.setFloatNode( + DatasetTypes.FloatNode.newBuilder.setValue(v).build) + .build) + case v: Double => Some( + DatasetTypes.TreeNode.newBuilder.setDoubleNode( + DatasetTypes.DoubleNode.newBuilder.setValue(v).build) + .build) + case v: Boolean => Some( + DatasetTypes.TreeNode.newBuilder.setBooleanNode( + DatasetTypes.BooleanNode.newBuilder.setValue(v).build) + .build) + case _ => None // fixme complete this + } + } + + private def translateFilter(pushedFilter: Filter): Option[TreeNode] = { + pushedFilter match { + case EqualTo(attribute, value) => + createComparisonNode("equal", attribute, value) + case GreaterThan(attribute, value) => + createComparisonNode("greater", attribute, value) + case GreaterThanOrEqual(attribute, value) => + createComparisonNode("greater_equal", attribute, value) + case LessThan(attribute, value) => + createComparisonNode("less", attribute, value) + case LessThanOrEqual(attribute, value) => + createComparisonNode("less_equal", attribute, value) + case Not(child) => + createNotNode(child) + case And(left, right) => + createAndNode(left, right) + case Or(left, right) => + createOrNode(left, right) + case IsNotNull(attribute) => + createIsNotNullNode(attribute) + case IsNull(attribute) => + createIsNullNode(attribute) + case _ => None // fixme complete this + } + } + + private def createComparisonNode(opName: String, + attribute: String, value: Any): Option[TreeNode] = { + val translatedValue = translateValue(value) + translatedValue match { + case Some(v) => Some( + DatasetTypes.TreeNode.newBuilder.setCpNode( + DatasetTypes.ComparisonNode.newBuilder + .setOpName(opName) // todo make op names enumerable + .setLeftArg( + DatasetTypes.TreeNode.newBuilder.setFieldNode( + DatasetTypes.FieldNode.newBuilder.setName(attribute).build) + .build) + .setRightArg(v) + .build) + .build) + case None => None + } + } + + def createNotNode(child: Filter): Option[TreeNode] = { + val translatedChild = translateFilter(child) + if (translatedChild.isEmpty) { + return None + } + Some(DatasetTypes.TreeNode.newBuilder + .setNotNode(DatasetTypes.NotNode.newBuilder.setArgs(translatedChild.get).build()).build()) + } + + def createIsNotNullNode(attribute: String): Option[TreeNode] = { + Some(DatasetTypes.TreeNode.newBuilder + .setIsValidNode( + DatasetTypes.IsValidNode.newBuilder.setArgs( + DatasetTypes.TreeNode.newBuilder.setFieldNode( + DatasetTypes.FieldNode.newBuilder.setName(attribute).build) + .build).build()).build()) + } + + def createIsNullNode(attribute: String): Option[TreeNode] = { + Some(DatasetTypes.TreeNode.newBuilder + .setNotNode( + DatasetTypes.NotNode.newBuilder.setArgs( + DatasetTypes.TreeNode.newBuilder + .setIsValidNode( + DatasetTypes.IsValidNode.newBuilder.setArgs( + DatasetTypes.TreeNode.newBuilder.setFieldNode( + DatasetTypes.FieldNode.newBuilder.setName(attribute).build) + .build) + .build()).build()).build()).build()) + } + + def createAndNode(left: Filter, right: Filter): Option[TreeNode] = { + val translatedLeft = translateFilter(left) + val translatedRight = translateFilter(right) + if (translatedLeft.isEmpty || translatedRight.isEmpty) { + return None + } + Some(DatasetTypes.TreeNode.newBuilder + .setAndNode(DatasetTypes.AndNode.newBuilder + .setLeftArg(translatedLeft.get) + .setRightArg(translatedRight.get) + .build()) + .build()) + } + + def createOrNode(left: Filter, right: Filter): Option[TreeNode] = { + val translatedLeft = translateFilter(left) + val translatedRight = translateFilter(right) + if (translatedLeft.isEmpty || translatedRight.isEmpty) { + return None + } + Some(DatasetTypes.TreeNode.newBuilder + .setOrNode(DatasetTypes.OrNode.newBuilder + .setLeftArg(translatedLeft.get) + .setRightArg(translatedRight.get) + .build()) + .build()) + } +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowOptions.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowOptions.scala new file mode 100644 index 000000000..5be9f6a4a --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowOptions.scala @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import org.apache.spark.sql.catalyst.util.CaseInsensitiveMap + +class ArrowOptions(@transient private val parameters: CaseInsensitiveMap[String]) + extends Serializable { + + def this(parameters: Map[String, String]) = this(CaseInsensitiveMap(parameters)) + + val originalFormat = parameters + .get(ArrowOptions.KEY_ORIGINAL_FORMAT) + .getOrElse(ArrowOptions.DEFAULT_ORIGINAL_FORMAT) + @deprecated + val filesystem = parameters + .get(ArrowOptions.KEY_FILESYSTEM) + .getOrElse(ArrowOptions.DEFAULT_FILESYSTEM) +} + +object ArrowOptions { + val KEY_ORIGINAL_FORMAT = "originalFormat" + val DEFAULT_ORIGINAL_FORMAT = "parquet" + @deprecated + val KEY_FILESYSTEM = "filesystem" + val DEFAULT_FILESYSTEM = "hdfs" +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowPartitionReaderFactory.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowPartitionReaderFactory.scala new file mode 100644 index 000000000..1f9145fb6 --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowPartitionReaderFactory.scala @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import java.net.URLDecoder + +import scala.collection.JavaConverters._ + +import com.intel.oap.spark.sql.execution.datasources.v2.arrow.ArrowPartitionReaderFactory.ColumnarBatchRetainer +import com.intel.oap.spark.sql.execution.datasources.v2.arrow.ArrowSQLConf._ +import org.apache.arrow.dataset.scanner.ScanOptions + +import org.apache.spark.broadcast.Broadcast +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.connector.read.{InputPartition, PartitionReader} +import org.apache.spark.sql.execution.datasources.PartitionedFile +import org.apache.spark.sql.execution.datasources.v2.FilePartitionReaderFactory +import org.apache.spark.sql.internal.SQLConf +import org.apache.spark.sql.sources.Filter +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.vectorized.ColumnarBatch +import org.apache.spark.util.SerializableConfiguration + +case class ArrowPartitionReaderFactory( + sqlConf: SQLConf, + broadcastedConf: Broadcast[SerializableConfiguration], + readDataSchema: StructType, + readPartitionSchema: StructType, + pushedFilters: Array[Filter], + options: ArrowOptions) + extends FilePartitionReaderFactory { + + private val batchSize = sqlConf.parquetVectorizedReaderBatchSize + private val enableFilterPushDown: Boolean = sqlConf.arrowFilterPushDown + + override def supportColumnarReads(partition: InputPartition): Boolean = true + + override def buildReader(partitionedFile: PartitionedFile): PartitionReader[InternalRow] = { + // disable row based read + throw new UnsupportedOperationException + } + + override def buildColumnarReader( + partitionedFile: PartitionedFile): PartitionReader[ColumnarBatch] = { + val path = partitionedFile.filePath + val factory = ArrowUtils.makeArrowDiscovery(URLDecoder.decode(path, "UTF-8"), + partitionedFile.start, partitionedFile.length, options) + val dataset = factory.finish() + val filter = if (enableFilterPushDown) { + ArrowFilters.translateFilters(ArrowFilters.pruneWithSchema(pushedFilters, readDataSchema)) + } else { + org.apache.arrow.dataset.filter.Filter.EMPTY + } + val scanOptions = new ScanOptions(readDataSchema.map(f => f.name).toArray, + filter, batchSize) + val scanner = dataset.newScan(scanOptions) + + val taskList = scanner + .scan() + .iterator() + .asScala + .toList + + val vsrItrList = taskList + .map(task => task.scan()) + + val batchItr = vsrItrList + .toIterator + .flatMap(itr => itr.asScala) + .map(bundledVectors => ArrowUtils.loadVectors(bundledVectors, partitionedFile.partitionValues, + readPartitionSchema, readDataSchema)) + + new PartitionReader[ColumnarBatch] { + val holder = new ColumnarBatchRetainer() + + override def next(): Boolean = { + holder.release() + batchItr.hasNext + } + + override def get(): ColumnarBatch = { + val batch = batchItr.next() + holder.retain(batch) + batch + } + + override def close(): Unit = { + holder.release() + vsrItrList.foreach(itr => itr.close()) + taskList.foreach(task => task.close()) + scanner.close() + dataset.close() + factory.close() + } + } + } +} + +object ArrowPartitionReaderFactory { + private class ColumnarBatchRetainer { + private var retained: Option[ColumnarBatch] = None + + def retain(batch: ColumnarBatch): Unit = { + if (retained.isDefined) { + throw new IllegalStateException + } + retained = Some(batch) + } + + def release(): Unit = { + retained.foreach(b => b.close()) + retained = None + } + } +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowSQLConf.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowSQLConf.scala new file mode 100644 index 000000000..3b0cb6932 --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowSQLConf.scala @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import org.apache.spark.sql.internal.SQLConf + +object ArrowSQLConf { + val ARROW_FILTER_PUSHDOWN_ENABLED = SQLConf.buildConf("spark.sql.arrow.filterPushdown") + .doc("Enables Arrow filter push-down optimization when set to true.") + .booleanConf + .createWithDefault(true) + + implicit def fromSQLConf(c: SQLConf): ArrowSQLConf = { + new ArrowSQLConf(c) + } +} + +class ArrowSQLConf(c: SQLConf) { + def arrowFilterPushDown: Boolean = c.getConf(ArrowSQLConf.ARROW_FILTER_PUSHDOWN_ENABLED) +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowScan.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowScan.scala new file mode 100644 index 000000000..20e069e01 --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowScan.scala @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import scala.collection.JavaConverters._ + +import org.apache.hadoop.fs.Path + +import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.catalyst.expressions.Expression +import org.apache.spark.sql.connector.read.PartitionReaderFactory +import org.apache.spark.sql.execution.datasources.PartitioningAwareFileIndex +import org.apache.spark.sql.execution.datasources.v2.FileScan +import org.apache.spark.sql.sources.Filter +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.util.CaseInsensitiveStringMap +import org.apache.spark.util.SerializableConfiguration + +case class ArrowScan( + sparkSession: SparkSession, + fileIndex: PartitioningAwareFileIndex, + readDataSchema: StructType, + readPartitionSchema: StructType, + pushedFilters: Array[Filter], + options: CaseInsensitiveStringMap, + partitionFilters: Seq[Expression] = Seq.empty, + dataFilters: Seq[Expression] = Seq.empty) + extends FileScan { + + override def isSplitable(path: Path): Boolean = { + ArrowUtils.isOriginalFormatSplitable( + new ArrowOptions(new CaseInsensitiveStringMap(options).asScala.toMap)) + } + + override def createReaderFactory(): PartitionReaderFactory = { + val caseSensitiveMap = options.asCaseSensitiveMap().asScala.toMap + val hconf = sparkSession.sessionState.newHadoopConfWithOptions(caseSensitiveMap) + val broadcastedConf = + sparkSession.sparkContext.broadcast(new SerializableConfiguration(hconf)) + ArrowPartitionReaderFactory( + sparkSession.sessionState.conf, + broadcastedConf, + readDataSchema, + readPartitionSchema, + pushedFilters, + new ArrowOptions(options.asScala.toMap)) + } + + override def withFilters(partitionFilters: Seq[Expression], + dataFilters: Seq[Expression]): FileScan = + this.copy(partitionFilters = partitionFilters, dataFilters = dataFilters) +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowScanBuilder.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowScanBuilder.scala new file mode 100644 index 000000000..6583455e0 --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowScanBuilder.scala @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.connector.read.{Scan, SupportsPushDownFilters} +import org.apache.spark.sql.execution.datasources.PartitioningAwareFileIndex +import org.apache.spark.sql.execution.datasources.v2.FileScanBuilder +import org.apache.spark.sql.sources.Filter +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.util.CaseInsensitiveStringMap + +case class ArrowScanBuilder( + sparkSession: SparkSession, + fileIndex: PartitioningAwareFileIndex, + schema: StructType, + dataSchema: StructType, + options: CaseInsensitiveStringMap) + extends FileScanBuilder(sparkSession, fileIndex, dataSchema) + with SupportsPushDownFilters { + + private var filters: Array[Filter] = Array.empty + private lazy val pushedArrowFilters: Array[Filter] = { + filters // todo filter validation & pushdown + } + + override def pushFilters(filters: Array[Filter]): Array[Filter] = { + this.filters = filters + this.filters + } + + override def pushedFilters: Array[Filter] = pushedArrowFilters + + override def build(): Scan = { + ArrowScan( + sparkSession, + fileIndex, + readDataSchema(), + readPartitionSchema(), + pushedFilters, + options) + } +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowTable.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowTable.scala new file mode 100644 index 000000000..c25864a53 --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowTable.scala @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import org.apache.arrow.memory.AllocationListener +import org.apache.hadoop.fs.FileStatus + +import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.connector.read.ScanBuilder +import org.apache.spark.sql.connector.write.{LogicalWriteInfo, WriteBuilder} +import org.apache.spark.sql.execution.datasources.FileFormat +import org.apache.spark.sql.execution.datasources.v2.FileTable +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.util.CaseInsensitiveStringMap + +case class ArrowTable( + name: String, + sparkSession: SparkSession, + options: CaseInsensitiveStringMap, + paths: Seq[String], + userSpecifiedSchema: Option[StructType], + fallbackFileFormat: Class[_ <: FileFormat]) + extends FileTable(sparkSession, options, paths, userSpecifiedSchema) { + + override def inferSchema(files: Seq[FileStatus]): Option[StructType] = { + ArrowUtils.readSchema(files, options) + } + + override def newScanBuilder(options: CaseInsensitiveStringMap): ScanBuilder = { + ArrowScanBuilder(sparkSession, fileIndex, schema, dataSchema, options) + } + + override def newWriteBuilder(info: LogicalWriteInfo): WriteBuilder = { + throw new UnsupportedOperationException // fixme implement later + } + + override def formatName: String = "ARROW" +} diff --git a/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowUtils.scala b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowUtils.scala new file mode 100644 index 000000000..bbffab14d --- /dev/null +++ b/arrow-data-source/standard/src/main/scala/com/intel/oap/spark/sql/execution/datasources/v2/arrow/ArrowUtils.scala @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.v2.arrow + +import java.net.URI +import java.util.TimeZone + +import scala.collection.JavaConverters._ + +import com.intel.oap.vectorized.ArrowWritableColumnVector +import org.apache.arrow.dataset.file.SingleFileDatasetFactory +import org.apache.arrow.dataset.scanner.ScanTask +import org.apache.arrow.vector.FieldVector +import org.apache.arrow.vector.types.pojo.ArrowType.ArrowTypeID +import org.apache.arrow.vector.types.pojo.Schema +import org.apache.hadoop.fs.FileStatus + +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.execution.datasources.v2.arrow.{SparkMemoryUtils, SparkSchemaUtils} +import org.apache.spark.sql.execution.vectorized.ColumnVectorUtils +import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.util.CaseInsensitiveStringMap +import org.apache.spark.sql.vectorized.ColumnarBatch + +object ArrowUtils { + + def readSchema(file: FileStatus, options: CaseInsensitiveStringMap): Option[StructType] = { + val factory: SingleFileDatasetFactory = + makeArrowDiscovery(file.getPath.toString, -1L, -1L, + new ArrowOptions(options.asScala.toMap)) + val schema = factory.inspect() + try { + Option(SparkSchemaUtils.fromArrowSchema(schema)) + } finally { + factory.close() + } + } + + def readSchema(files: Seq[FileStatus], options: CaseInsensitiveStringMap): Option[StructType] = + readSchema(files.toList.head, options) // todo merge schema + + def isOriginalFormatSplitable(options: ArrowOptions): Boolean = { + val format = getFormat(options).getOrElse(throw new IllegalStateException) + format match { + case org.apache.arrow.dataset.file.FileFormat.PARQUET => + true + case _ => + false + } + } + + def makeArrowDiscovery(file: String, startOffset: Long, length: Long, + options: ArrowOptions): SingleFileDatasetFactory = { + + val format = getFormat(options).getOrElse(throw new IllegalStateException) + val allocator = SparkMemoryUtils.contextAllocator() + val factory = new SingleFileDatasetFactory(allocator, + SparkMemoryUtils.contextMemoryPool(), + format, + rewriteUri(file), + startOffset, + length) + factory + } + + def toArrowSchema(t: StructType): Schema = { + // fixme this might be platform dependent + SparkSchemaUtils.toArrowSchema(t, TimeZone.getDefault.getID) + } + + def loadVectors(bundledVectors: ScanTask.ArrowBundledVectors, partitionValues: InternalRow, + partitionSchema: StructType, dataSchema: StructType): ColumnarBatch = { + val rowCount: Int = getRowCount(bundledVectors) + val dataVectors = getDataVectors(bundledVectors, dataSchema) + val dictionaryVectors = getDictionaryVectors(bundledVectors, dataSchema) + + val vectors = ArrowWritableColumnVector.loadColumns(rowCount, dataVectors.asJava, + dictionaryVectors.asJava) + val partitionColumns = ArrowWritableColumnVector.allocateColumns(rowCount, partitionSchema) + (0 until partitionColumns.length).foreach(i => { + ColumnVectorUtils.populate(partitionColumns(i), partitionValues, i) + partitionColumns(i).setIsConstant() + }) + + val batch = new ColumnarBatch(vectors ++ partitionColumns, rowCount) + batch + } + + private def getRowCount(bundledVectors: ScanTask.ArrowBundledVectors) = { + val valueVectors = bundledVectors.valueVectors + val rowCount = valueVectors.getRowCount + rowCount + } + + private def getDataVectors(bundledVectors: ScanTask.ArrowBundledVectors, + dataSchema: StructType): List[FieldVector] = { + // TODO Deprecate following (bad performance maybe brought). + // TODO Assert vsr strictly matches dataSchema instead. + val valueVectors = bundledVectors.valueVectors + dataSchema.map(f => { + val vector = valueVectors.getVector(f.name) + if (vector == null) { + throw new IllegalStateException("Error: no vector named " + f.name + " in record bach") + } + vector + }).toList + } + + private def getDictionaryVectors(bundledVectors: ScanTask.ArrowBundledVectors, + dataSchema: StructType): List[FieldVector] = { + val valueVectors = bundledVectors.valueVectors + val dictionaryVectorMap = bundledVectors.dictionaryVectors + + val fieldNameToDictionaryEncoding = valueVectors.getSchema.getFields.asScala.map(f => { + f.getName -> f.getDictionary + }).toMap + + val dictionaryVectorsWithNulls = dataSchema.map(f => { + val de = fieldNameToDictionaryEncoding(f.name) + + Option(de) match { + case None => null + case _ => + if (de.getIndexType.getTypeID != ArrowTypeID.Int) { + throw new IllegalArgumentException("Wrong index type: " + de.getIndexType) + } + dictionaryVectorMap.get(de.getId).getVector + } + }).toList + dictionaryVectorsWithNulls + } + + private def getFormat( + options: ArrowOptions): Option[org.apache.arrow.dataset.file.FileFormat] = { + Option(options.originalFormat match { + case "parquet" => org.apache.arrow.dataset.file.FileFormat.PARQUET + case _ => throw new IllegalArgumentException("Unrecognizable format") + }) + } + + private def rewriteUri(uriStr: String): String = { + val uri = URI.create(uriStr) + val sch = uri.getScheme match { + case "hdfs" => "hdfs" + case "file" => "file" + } + val ssp = uri.getScheme match { + case "hdfs" => uri.getRawSchemeSpecificPart + case "file" => "//" + uri.getRawSchemeSpecificPart + } + val rewritten = new URI(sch, ssp, uri.getFragment) + rewritten.toString + } +} diff --git a/core/src/test/resources/test-data/cars.csv b/arrow-data-source/standard/src/test/resources/cars.csv similarity index 100% rename from core/src/test/resources/test-data/cars.csv rename to arrow-data-source/standard/src/test/resources/cars.csv diff --git a/arrow-data-source/standard/src/test/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowDataSourceTPCHBasedTest.scala b/arrow-data-source/standard/src/test/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowDataSourceTPCHBasedTest.scala new file mode 100644 index 000000000..b33d4a1d3 --- /dev/null +++ b/arrow-data-source/standard/src/test/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowDataSourceTPCHBasedTest.scala @@ -0,0 +1,286 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intel.oap.spark.sql.execution.datasources.arrow + +import java.util.concurrent.{Executors, TimeUnit} + +import com.intel.oap.spark.sql.DataFrameReaderImplicits._ +import com.intel.oap.spark.sql.execution.datasources.v2.arrow.{ArrowOptions, ArrowUtils} + +import org.apache.spark.SparkConf +import org.apache.spark.sql.QueryTest +import org.apache.spark.sql.execution.datasources.v2.arrow.SparkMemoryUtils +import org.apache.spark.sql.internal.SQLConf +import org.apache.spark.sql.test.SharedSparkSession + +class ArrowDataSourceTPCHBasedTest extends QueryTest with SharedSparkSession { + + // tpc-h query cases: generated tpc-h dataset required + private val prefix = "/root/Downloads/" + private val tpchFolder = "date_tpch_10" + private val lineitem = prefix + tpchFolder + "/lineitem" + private val part = prefix + tpchFolder + "/part" + private val partSupp = prefix + tpchFolder + "/partsupp" + private val supplier = prefix + tpchFolder + "/supplier" + private val orders = prefix + tpchFolder + "/orders" + private val nation = prefix + tpchFolder + "/nation" + + + override protected def sparkConf: SparkConf = { + val conf = super.sparkConf + conf.set("spark.memory.offHeap.size", String.valueOf(128 * 1024 * 1024)) + conf + } + + ignore("tpch lineitem - desc") { + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(lineitem) + frame.createOrReplaceTempView("lineitem") + + spark.sql("describe lineitem").show() + } + + ignore("tpch part - special characters in path") { + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(part) + frame.createOrReplaceTempView("part") + + spark.sql("select * from part limit 100").show() + } + + ignore("tpch lineitem - read partition values") { + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(orders) + frame.createOrReplaceTempView("orders") + + spark.sql("select o_orderdate from orders limit 100").show() + } + + ignore("tpch lineitem - asterisk select") { + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(lineitem) + frame.createOrReplaceTempView("lineitem") + + spark.sql("select * from lineitem limit 10").show() + } + + ignore("tpch query 6") { + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(lineitem) + frame.createOrReplaceTempView("lineitem") + + spark.sql("select\n\tsum(l_extendedprice * l_discount) as revenue\n" + + "from\n\tlineitem\n" + + "where\n\tl_shipdate >= date '1994-01-01'\n\t" + + "and l_shipdate < date '1994-01-01' + interval '1' year\n\t" + + "and l_discount between .06 - 0.01 and .06 + 0.01\n\t" + + "and l_quantity < 24").show() + } + + ignore("tpch query 6 - performance comparision") { + val iterations = 10 + withSQLConf(SQLConf.PARQUET_FILTER_PUSHDOWN_ENABLED.key -> "false") { + val frame1 = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(lineitem) + frame1.createOrReplaceTempView("lineitem_arrow") + + val frame2 = spark.read + .parquet(lineitem) + frame2.createOrReplaceTempView("lineitem_parquet") + + val pPrev = System.currentTimeMillis() + (0 until iterations).foreach(_ => + spark.sql("select\n\tsum(l_extendedprice * l_discount) as revenue\n" + + "from\n\tlineitem_parquet\n" + + "where\n\tl_shipdate >= date '1994-01-01'\n\t" + + "and l_shipdate < date '1994-01-01' + interval '1' year\n\t" + + "and l_discount between .06 - 0.01 and .06 + 0.01\n\t" + + "and l_quantity < 24").show() + ) + val parquetExecTime = System.currentTimeMillis() - pPrev + + val aPrev = System.currentTimeMillis() + (0 until iterations).foreach(_ => { + // scalastyle:off println + println(SparkMemoryUtils.contextAllocator().getAllocatedMemory) + // scalastyle:on println + spark.sql("select\n\tsum(l_extendedprice * l_discount) as revenue\n" + + "from\n\tlineitem_arrow\n" + + "where\n\tl_shipdate >= date '1994-01-01'\n\t" + + "and l_shipdate < date '1994-01-01' + interval '1' year\n\t" + + "and l_discount between .06 - 0.01 and .06 + 0.01\n\t" + + "and l_quantity < 24").show() + } + ) + val arrowExecTime = System.currentTimeMillis() - aPrev + + // unstable assert + assert(arrowExecTime < parquetExecTime) + } + } + + ignore("tpch query 16 - performance comparision") { + val iterations = 1 + withSQLConf(SQLConf.PARQUET_FILTER_PUSHDOWN_ENABLED.key -> "false") { + val frame1 = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(partSupp) + frame1.createOrReplaceTempView("partsupp_arrow") + + val frame2 = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(part) + frame2.createOrReplaceTempView("part_arrow") + + val frame3 = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(supplier) + frame3.createOrReplaceTempView("supplier_arrow") + + val frame4 = spark.read + .parquet(partSupp) + frame4.createOrReplaceTempView("partsupp_parquet") + + val frame5 = spark.read + .parquet(part) + frame5.createOrReplaceTempView("part_parquet") + + val frame6 = spark.read + .parquet(supplier) + frame6.createOrReplaceTempView("supplier_parquet") + + val pPrev = System.currentTimeMillis() + (0 until iterations).foreach(_ => + spark.sql("select\n\tp_brand,\n\tp_type,\n\tp_size," + + "\n\tcount(distinct ps_suppkey) as supplier_cnt\n" + + "from\n\tpartsupp_parquet,\n\tpart_parquet\nwhere\n\tp_partkey" + + " = ps_partkey\n\tand p_brand <> 'Brand#45'\n\t" + + "and p_type not like 'MEDIUM POLISHED%'\n\tand p_size in " + + "(49, 14, 23, 45, 19, 3, 36, 9)\n\t" + + "and ps_suppkey not in (\n\t\tselect\n\t\t\ts_suppkey\n\t\t" + + "from\n\t\t\tsupplier_parquet\n\t\twhere\n\t\t\t" + + "s_comment like '%Customer%Complaints%'\n\t)\ngroup by\n\t" + + "p_brand,\n\tp_type,\n\tp_size\norder by\n\t" + + "supplier_cnt desc,\n\tp_brand,\n\tp_type,\n\tp_size").show() + ) + val parquetExecTime = System.currentTimeMillis() - pPrev + + val aPrev = System.currentTimeMillis() + (0 until iterations).foreach(_ => + spark.sql("select\n\tp_brand,\n\tp_type,\n\tp_size," + + "\n\tcount(distinct ps_suppkey) as supplier_cnt\n" + + "from\n\tpartsupp_arrow,\n\tpart_arrow\nwhere\n\tp_partkey" + + " = ps_partkey\n\tand p_brand <> 'Brand#45'\n\t" + + "and p_type not like 'MEDIUM POLISHED%'\n\tand p_size in " + + "(49, 14, 23, 45, 19, 3, 36, 9)\n\t" + + "and ps_suppkey not in (\n\t\tselect\n\t\t\ts_suppkey\n\t\t" + + "from\n\t\t\tsupplier_arrow\n\t\twhere\n\t\t\t" + + "s_comment like '%Customer%Complaints%'\n\t)\ngroup by\n\t" + + "p_brand,\n\tp_type,\n\tp_size\norder by\n\t" + + "supplier_cnt desc,\n\tp_brand,\n\tp_type,\n\tp_size").show() + ) + val arrowExecTime = System.currentTimeMillis() - aPrev + + // scalastyle:off println + println(arrowExecTime) + println(parquetExecTime) + // scalastyle:on println + // unstable assert + assert(arrowExecTime < parquetExecTime) + } + } + + ignore("tpch query 1") { + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(lineitem) + frame.createOrReplaceTempView("lineitem") + + spark.sql("select\n\tl_returnflag,\n\tl_linestatus," + + "\n\tsum(l_quantity) as sum_qty,\n\t" + + "sum(l_extendedprice) as sum_base_price," + + "\n\tsum(l_extendedprice * (1 - l_discount)) as sum_disc_price,\n\t" + + "sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge," + + "\n\tavg(l_quantity) as avg_qty,\n\t" + + "avg(l_extendedprice) as avg_price,\n\tavg(l_discount) as avg_disc," + + "\n\tcount(*) as count_order\nfrom\n\t" + + "lineitem\nwhere\n\tl_shipdate <= date '1998-12-01' - interval '90' day" + + "\ngroup by\n\tl_returnflag,\n\t" + + "l_linestatus\norder by\n\tl_returnflag,\n\tl_linestatus").explain(true) + } + + ignore("tpch query 21 - memory leak") { + val frame1 = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(supplier) + frame1.createOrReplaceTempView("supplier") + val frame2 = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(lineitem) + frame2.createOrReplaceTempView("lineitem") + val frame3 = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(orders) + frame3.createOrReplaceTempView("orders") + val frame4 = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(nation) + frame4.createOrReplaceTempView("nation") + + Executors.newSingleThreadExecutor().execute(() => { + spark.sql("select\n\ts_name,\n\tcount(*) as numwait\nfrom\n\tsupplier,\n\t" + + "lineitem l1,\n\torders,\n\tnation\nwhere\n\ts_suppkey = l1.l_suppkey\n\t" + + "and o_orderkey = l1.l_orderkey\n\tand o_orderstatus = 'F'\n\tand " + + "l1.l_receiptdate > l1.l_commitdate\n\tand exists (\n\t\tselect\n\t\t\t*\n\t\tfrom\n\t\t\t" + + "lineitem l2\n\t\twhere\n\t\t\tl2.l_orderkey = l1.l_orderkey\n\t\t\tand " + + "l2.l_suppkey <> l1.l_suppkey\n\t)\n\tand not exists (\n\t\tselect\n\t\t\t*\n\t\t" + + "from\n\t\t\tlineitem l3\n\t\twhere\n\t\t\tl3.l_orderkey = l1.l_orderkey\n\t\t\t" + + "and l3.l_suppkey <> l1.l_suppkey\n\t\t\tand l3.l_receiptdate > " + + "l3.l_commitdate\n\t)\n\tand s_nationkey = n_nationkey\n\tand n_name = 'SAUDI ARABIA'\n" + + "group by\n\ts_name\norder by\n\tnumwait desc,\n\t" + + "s_name\nlimit 100").show() + }) + Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(() => { + println("[org.apache.spark.sql.util.ArrowUtils.rootAllocator] " + + "Allocated memory amount: " + SparkMemoryUtils.contextAllocator()) + println("[com.intel.oap.vectorized.ArrowWritableColumnVector.allocator] " + + "Allocated memory amount: " + SparkMemoryUtils.contextAllocator().getAllocatedMemory) + }, 0L, 100L, TimeUnit.MILLISECONDS) + Thread.sleep(60 * 60 * 1000L) + } + +} diff --git a/arrow-data-source/standard/src/test/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowDataSourceTest.scala b/arrow-data-source/standard/src/test/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowDataSourceTest.scala new file mode 100644 index 000000000..f88e085fa --- /dev/null +++ b/arrow-data-source/standard/src/test/scala/com/intel/oap/spark/sql/execution/datasources/arrow/ArrowDataSourceTest.scala @@ -0,0 +1,303 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.intel.oap.spark.sql.execution.datasources.arrow + +import java.io.File +import java.lang.management.ManagementFactory + +import com.intel.oap.spark.sql.DataFrameReaderImplicits._ +import com.intel.oap.spark.sql.execution.datasources.v2.arrow.ArrowOptions +import com.sun.management.UnixOperatingSystemMXBean +import org.apache.commons.io.FileUtils + +import org.apache.spark.SparkConf +import org.apache.spark.sql.{DataFrame, QueryTest, Row} +import org.apache.spark.sql.execution.datasources.v2.arrow.SparkMemoryUtils +import org.apache.spark.sql.functions.col +import org.apache.spark.sql.internal.SQLConf +import org.apache.spark.sql.test.SharedSparkSession +import org.apache.spark.sql.types.{LongType, StringType, StructField, StructType} + +class ArrowDataSourceTest extends QueryTest with SharedSparkSession { + private val parquetFile1 = "parquet-1.parquet" + private val parquetFile2 = "parquet-2.parquet" + private val parquetFile3 = "parquet-3.parquet" + private val parquetFile4 = "parquet-4.parquet" + private val parquetFile5 = "parquet-5.parquet" + + override protected def sparkConf: SparkConf = { + val conf = super.sparkConf + conf.set("spark.memory.offHeap.size", String.valueOf(10 * 1024 * 1024)) + conf + } + + override def beforeAll(): Unit = { + super.beforeAll() + import testImplicits._ + spark.read + .json(Seq("{\"col\": -1}", "{\"col\": 0}", "{\"col\": 1}", "{\"col\": 2}", "{\"col\": null}") + .toDS()) + .repartition(1) + .write + .mode("overwrite") + .parquet(ArrowDataSourceTest.locateResourcePath(parquetFile1)) + + spark.read + .json(Seq("{\"col\": \"a\"}", "{\"col\": \"b\"}") + .toDS()) + .repartition(1) + .write + .mode("overwrite") + .parquet(ArrowDataSourceTest.locateResourcePath(parquetFile2)) + + spark.read + .json(Seq("{\"col1\": \"apple\", \"col2\": 100}", "{\"col1\": \"pear\", \"col2\": 200}", + "{\"col1\": \"apple\", \"col2\": 300}") + .toDS()) + .repartition(1) + .write + .mode("overwrite") + .parquet(ArrowDataSourceTest.locateResourcePath(parquetFile3)) + + spark.range(1000) + .select(col("id"), col("id").as("k")) + .write + .partitionBy("k") + .format("parquet") + .mode("overwrite") + .parquet(ArrowDataSourceTest.locateResourcePath(parquetFile4)) + + spark.range(100) + .select(col("id"), col("id").as("k")) + .write + .partitionBy("k") + .format("parquet") + .mode("overwrite") + .parquet(ArrowDataSourceTest.locateResourcePath(parquetFile5)) + + } + + override def afterAll(): Unit = { + delete(ArrowDataSourceTest.locateResourcePath(parquetFile1)) + delete(ArrowDataSourceTest.locateResourcePath(parquetFile2)) + delete(ArrowDataSourceTest.locateResourcePath(parquetFile3)) + delete(ArrowDataSourceTest.locateResourcePath(parquetFile4)) + delete(ArrowDataSourceTest.locateResourcePath(parquetFile5)) + super.afterAll() + } + + test("reading parquet file") { + val path = ArrowDataSourceTest.locateResourcePath(parquetFile1) + verifyParquet( + spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(path)) + } + + test("create catalog table") { + val path = ArrowDataSourceTest.locateResourcePath(parquetFile1) + spark.catalog.createTable("ptab", path, "arrow") + val sql = "select * from ptab" + spark.sql(sql).explain() + verifyParquet(spark.sql(sql)) + } + + test("create table statement") { + spark.sql("drop table if exists ptab") + spark.sql("create table ptab (col1 varchar(14), col2 bigint, col3 bigint) " + + "using arrow " + + "partitioned by (col1)") + spark.sql("select * from ptab") + } + + test("simple SQL query on parquet file - 1") { + val path = ArrowDataSourceTest.locateResourcePath(parquetFile1) + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(path) + frame.createOrReplaceTempView("ptab") + verifyParquet(spark.sql("select * from ptab")) + verifyParquet(spark.sql("select col from ptab")) + verifyParquet(spark.sql("select col from ptab where col is not null or col is null")) + } + + test("simple SQL query on parquet file - 2") { + val path = ArrowDataSourceTest.locateResourcePath(parquetFile3) + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(path) + frame.createOrReplaceTempView("ptab") + val sqlFrame = spark.sql("select * from ptab") + assert( + sqlFrame.schema === + StructType(Seq(StructField("col1", StringType), StructField("col2", LongType)))) + val rows = sqlFrame.collect() + assert(rows(0).get(0) == "apple") + assert(rows(0).get(1) == 100) + assert(rows(1).get(0) == "pear") + assert(rows(1).get(1) == 200) + assert(rows(2).get(0) == "apple") + assert(rows(2).get(1) == 300) + assert(rows.length === 3) + } + + test("simple SQL query on parquet file with pushed filters") { + val path = ArrowDataSourceTest.locateResourcePath(parquetFile1) + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(path) + frame.createOrReplaceTempView("ptab") + spark.sql("select col from ptab where col = 1").explain(true) + val result = spark.sql("select col from ptab where col = 1") // fixme rowcount == 2? + assert( + result.schema === + StructType(Seq(StructField("col", LongType)))) + assert(result.collect().length === 1) + } + + test("ignore unrecognizable types when pushing down filters") { + val path = ArrowDataSourceTest.locateResourcePath(parquetFile2) + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(path) + frame.createOrReplaceTempView("ptab") + val rows = spark.sql("select * from ptab where col = 'b'").collect() + assert(rows.length === 1) + } + + ignore("dynamic partition pruning") { + withSQLConf(SQLConf.DYNAMIC_PARTITION_PRUNING_ENABLED.key -> "true", + SQLConf.DYNAMIC_PARTITION_PRUNING_REUSE_BROADCAST_ONLY.key -> "false", + SQLConf.EXCHANGE_REUSE_ENABLED.key -> "false", + SQLConf.USE_V1_SOURCE_LIST.key -> "arrow", + SQLConf.CBO_ENABLED.key -> "true") { + + var path: String = null + path = ArrowDataSourceTest.locateResourcePath(parquetFile4) + spark.catalog.createTable("df1", path, "arrow") + path = ArrowDataSourceTest.locateResourcePath(parquetFile5) + spark.catalog.createTable("df2", path, "arrow") + + sql("ALTER TABLE df1 RECOVER PARTITIONS") + sql("ALTER TABLE df2 RECOVER PARTITIONS") + + sql("ANALYZE TABLE df1 COMPUTE STATISTICS FOR COLUMNS id") + sql("ANALYZE TABLE df2 COMPUTE STATISTICS FOR COLUMNS id") + + val df = sql("SELECT df1.id, df2.k FROM df1 " + + "JOIN df2 ON df1.k = df2.k AND df2.id < 2") + assert(df.queryExecution.executedPlan.toString().contains("dynamicpruningexpression")) + checkAnswer(df, Row(0, 0) :: Row(1, 1) :: Nil) + } + } + + test("file descriptor leak") { + val path = ArrowDataSourceTest.locateResourcePath(parquetFile1) + val frame = spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "parquet") + .option(ArrowOptions.KEY_FILESYSTEM, "hdfs") + .arrow(path) + frame.createOrReplaceTempView("ptab") + + def getFdCount: Long = { + ManagementFactory.getOperatingSystemMXBean + .asInstanceOf[UnixOperatingSystemMXBean] + .getOpenFileDescriptorCount + } + + val initialFdCount = getFdCount + for (_ <- 0 until 100) { + verifyParquet(spark.sql("select * from ptab")) + } + val fdGrowth = getFdCount - initialFdCount + assert(fdGrowth < 100) + } + + test("file descriptor leak - v1") { + val path = ArrowDataSourceTest.locateResourcePath(parquetFile1) + spark.catalog.createTable("ptab2", path, "arrow") + + def getFdCount: Long = { + ManagementFactory.getOperatingSystemMXBean + .asInstanceOf[UnixOperatingSystemMXBean] + .getOpenFileDescriptorCount + } + + val initialFdCount = getFdCount + for (_ <- 0 until 100) { + verifyParquet(spark.sql("select * from ptab2")) + } + val fdGrowth = getFdCount - initialFdCount + assert(fdGrowth < 100) + } + + // csv cases: not implemented + private val csvFile = "cars.csv" + + ignore("reading csv file without specifying original format") { + verifyCsv(spark.read.format("arrow").load(csvFile)) + } + + ignore("reading csv file") { + val path = ArrowDataSourceTest.locateResourcePath(csvFile) + verifyCsv( + spark.read + .format("arrow") + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "csv") + .load(path)) + } + + ignore("read csv file - programmatic API ") { + val path = ArrowDataSourceTest.locateResourcePath(csvFile) + verifyCsv( + spark.read + .option(ArrowOptions.KEY_ORIGINAL_FORMAT, "csv") + .arrow(path)) + } + + def verifyCsv(frame: DataFrame): Unit = { + // todo assert something + } + + def verifyParquet(frame: DataFrame): Unit = { + assert( + frame.schema === + StructType(Seq(StructField("col", LongType)))) + assert(frame.collect().length === 5) + } + + def delete(path: String): Unit = { + FileUtils.forceDelete(new File(path)) + } + + def closeAllocators(): Unit = { + SparkMemoryUtils.contextAllocator().close() + } +} + +object ArrowDataSourceTest { + private def locateResourcePath(resource: String): String = { + classOf[ArrowDataSourceTest].getClassLoader.getResource("") + .getPath.concat(File.separator).concat(resource) + } +} diff --git a/cpp/.gitignore b/cpp/.gitignore deleted file mode 100644 index 22da1f13b..000000000 --- a/cpp/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -thirdparty/*.tar* -CMakeFiles/ -CMakeCache.txt -CTestTestfile.cmake -Makefile -cmake_install.cmake -build/ -*-build/ -Testing/ -cmake-build-debug/ -cmake-build-release/ - -######################################### -# Editor temporary/working/backup files # -.#* -*\#*\# -[#]*# -*~ -*$ -*.bak -*flymake* -*.kdev4 -*.log -*.swp diff --git a/dep/arrow-data-source b/dep/arrow-data-source deleted file mode 160000 index 0ae27bcf9..000000000 --- a/dep/arrow-data-source +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0ae27bcf90731360de8135c8ba4002d943ce6d64 diff --git a/core/pom.xml b/native-sql-engine/core/pom.xml similarity index 98% rename from core/pom.xml rename to native-sql-engine/core/pom.xml index f5452b34b..6fd02b5ff 100644 --- a/core/pom.xml +++ b/native-sql-engine/core/pom.xml @@ -141,12 +141,12 @@ spark-arrow-datasource-common com.intel.oap - 1.1.0 + ${project.version} spark-arrow-datasource-standard com.intel.oap - 1.1.0 + ${project.version} test @@ -168,7 +168,7 @@ org.scalatest scalatest_${scala.binary.version} - 3.0.6 + 3.0.8 test @@ -368,7 +368,7 @@ false ${project.basedir}/src/main/scala ${project.basedir}/src/test/scala - ${project.basedir}/lib/scalastyle_config.xml + ${user.dir}/scalastyle-config.xml ${project.basedir}/scalastyle-output.xml UTF-8 @@ -383,7 +383,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.0.0 + 3.1.1 false true diff --git a/core/src/main/java/com/intel/oap/datasource/VectorizedParquetArrowReader.java b/native-sql-engine/core/src/main/java/com/intel/oap/datasource/VectorizedParquetArrowReader.java similarity index 100% rename from core/src/main/java/com/intel/oap/datasource/VectorizedParquetArrowReader.java rename to native-sql-engine/core/src/main/java/com/intel/oap/datasource/VectorizedParquetArrowReader.java diff --git a/core/src/main/java/com/intel/oap/datasource/parquet/ParquetReader.java b/native-sql-engine/core/src/main/java/com/intel/oap/datasource/parquet/ParquetReader.java similarity index 100% rename from core/src/main/java/com/intel/oap/datasource/parquet/ParquetReader.java rename to native-sql-engine/core/src/main/java/com/intel/oap/datasource/parquet/ParquetReader.java diff --git a/core/src/main/java/com/intel/oap/datasource/parquet/ParquetReaderJniWrapper.java b/native-sql-engine/core/src/main/java/com/intel/oap/datasource/parquet/ParquetReaderJniWrapper.java similarity index 100% rename from core/src/main/java/com/intel/oap/datasource/parquet/ParquetReaderJniWrapper.java rename to native-sql-engine/core/src/main/java/com/intel/oap/datasource/parquet/ParquetReaderJniWrapper.java diff --git a/core/src/main/java/com/intel/oap/datasource/parquet/ParquetWriter.java b/native-sql-engine/core/src/main/java/com/intel/oap/datasource/parquet/ParquetWriter.java similarity index 100% rename from core/src/main/java/com/intel/oap/datasource/parquet/ParquetWriter.java rename to native-sql-engine/core/src/main/java/com/intel/oap/datasource/parquet/ParquetWriter.java diff --git a/core/src/main/java/com/intel/oap/datasource/parquet/ParquetWriterJniWrapper.java b/native-sql-engine/core/src/main/java/com/intel/oap/datasource/parquet/ParquetWriterJniWrapper.java similarity index 100% rename from core/src/main/java/com/intel/oap/datasource/parquet/ParquetWriterJniWrapper.java rename to native-sql-engine/core/src/main/java/com/intel/oap/datasource/parquet/ParquetWriterJniWrapper.java diff --git a/core/src/main/java/com/intel/oap/expression/ArrowColumnarBatch.java b/native-sql-engine/core/src/main/java/com/intel/oap/expression/ArrowColumnarBatch.java similarity index 100% rename from core/src/main/java/com/intel/oap/expression/ArrowColumnarBatch.java rename to native-sql-engine/core/src/main/java/com/intel/oap/expression/ArrowColumnarBatch.java diff --git a/core/src/main/java/com/intel/oap/expression/ColumnarArithmeticWithGandiva.java b/native-sql-engine/core/src/main/java/com/intel/oap/expression/ColumnarArithmeticWithGandiva.java similarity index 100% rename from core/src/main/java/com/intel/oap/expression/ColumnarArithmeticWithGandiva.java rename to native-sql-engine/core/src/main/java/com/intel/oap/expression/ColumnarArithmeticWithGandiva.java diff --git a/core/src/main/java/com/intel/oap/vectorized/AdaptorReferenceManager.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/AdaptorReferenceManager.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/AdaptorReferenceManager.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/AdaptorReferenceManager.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ArrowBufBuilder.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowBufBuilder.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ArrowBufBuilder.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowBufBuilder.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ArrowCompressedStreamReader.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowCompressedStreamReader.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ArrowCompressedStreamReader.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowCompressedStreamReader.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ArrowFieldNodeBuilder.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowFieldNodeBuilder.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ArrowFieldNodeBuilder.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowFieldNodeBuilder.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilder.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilder.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilder.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilder.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilderImpl.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilderImpl.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilderImpl.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ArrowRecordBatchBuilderImpl.java diff --git a/core/src/main/java/com/intel/oap/vectorized/BatchIterator.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/BatchIterator.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/BatchIterator.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/BatchIterator.java diff --git a/core/src/main/java/com/intel/oap/vectorized/CompressedVectorLoader.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/CompressedVectorLoader.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/CompressedVectorLoader.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/CompressedVectorLoader.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ExpressionEvaluator.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ExpressionEvaluator.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ExpressionEvaluator.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ExpressionEvaluator.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ExpressionEvaluatorJniWrapper.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ExpressionEvaluatorJniWrapper.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ExpressionEvaluatorJniWrapper.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ExpressionEvaluatorJniWrapper.java diff --git a/core/src/main/java/com/intel/oap/vectorized/JniUtils.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/JniUtils.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/JniUtils.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/JniUtils.java diff --git a/core/src/main/java/com/intel/oap/vectorized/MetricsObject.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/MetricsObject.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/MetricsObject.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/MetricsObject.java diff --git a/core/src/main/java/com/intel/oap/vectorized/NativePartitioning.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/NativePartitioning.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/NativePartitioning.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/NativePartitioning.java diff --git a/core/src/main/java/com/intel/oap/vectorized/NativeSerializableObject.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/NativeSerializableObject.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/NativeSerializableObject.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/NativeSerializableObject.java diff --git a/core/src/main/java/com/intel/oap/vectorized/PartitionFileInfo.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/PartitionFileInfo.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/PartitionFileInfo.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/PartitionFileInfo.java diff --git a/core/src/main/java/com/intel/oap/vectorized/SerializableObject.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/SerializableObject.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/SerializableObject.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/SerializableObject.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ShuffleDecompressionJniWrapper.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ShuffleDecompressionJniWrapper.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ShuffleDecompressionJniWrapper.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ShuffleDecompressionJniWrapper.java diff --git a/core/src/main/java/com/intel/oap/vectorized/ShuffleSplitterJniWrapper.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ShuffleSplitterJniWrapper.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/ShuffleSplitterJniWrapper.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/ShuffleSplitterJniWrapper.java diff --git a/core/src/main/java/com/intel/oap/vectorized/SplitResult.java b/native-sql-engine/core/src/main/java/com/intel/oap/vectorized/SplitResult.java similarity index 100% rename from core/src/main/java/com/intel/oap/vectorized/SplitResult.java rename to native-sql-engine/core/src/main/java/com/intel/oap/vectorized/SplitResult.java diff --git a/core/src/main/java/test b/native-sql-engine/core/src/main/java/test similarity index 100% rename from core/src/main/java/test rename to native-sql-engine/core/src/main/java/test diff --git a/core/src/main/scala/com/intel/oap/ColumnarGuardRule.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/ColumnarGuardRule.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/ColumnarGuardRule.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/ColumnarGuardRule.scala diff --git a/core/src/main/scala/com/intel/oap/ColumnarPlugin.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/ColumnarPlugin.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/ColumnarPlugin.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/ColumnarPlugin.scala diff --git a/core/src/main/scala/com/intel/oap/ColumnarPluginConfig.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/ColumnarPluginConfig.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/ColumnarPluginConfig.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/ColumnarPluginConfig.scala diff --git a/core/src/main/scala/com/intel/oap/execution/BroadcastColumnarRDD.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/BroadcastColumnarRDD.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/BroadcastColumnarRDD.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/BroadcastColumnarRDD.scala diff --git a/core/src/main/scala/com/intel/oap/execution/CoalesceBatchesExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/CoalesceBatchesExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/CoalesceBatchesExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/CoalesceBatchesExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarBasicPhysicalOperators.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarBasicPhysicalOperators.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarBasicPhysicalOperators.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarBasicPhysicalOperators.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarBatchScanExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarBatchScanExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarBatchScanExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarBatchScanExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarBroadcastHashJoinExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarBroadcastHashJoinExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarBroadcastHashJoinExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarBroadcastHashJoinExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarDataSourceRDD.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarDataSourceRDD.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarDataSourceRDD.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarDataSourceRDD.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarExpandExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarExpandExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarExpandExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarExpandExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarHashAggregateExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarHashAggregateExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarHashAggregateExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarHashAggregateExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarShuffledHashJoinExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarShuffledHashJoinExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarShuffledHashJoinExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarShuffledHashJoinExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarSortExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarSortExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarSortExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarSortExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarSortMergeJoinExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarSortMergeJoinExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarSortMergeJoinExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarSortMergeJoinExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarWholeStageCodegenExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarWholeStageCodegenExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarWholeStageCodegenExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarWholeStageCodegenExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/ColumnarWindowExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarWindowExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/ColumnarWindowExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/ColumnarWindowExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/DataToArrowColumnarExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/DataToArrowColumnarExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/DataToArrowColumnarExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/DataToArrowColumnarExec.scala diff --git a/core/src/main/scala/com/intel/oap/execution/RowToArrowColumnarExec.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/execution/RowToArrowColumnarExec.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/execution/RowToArrowColumnarExec.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/execution/RowToArrowColumnarExec.scala diff --git a/core/src/main/scala/com/intel/oap/expression/CodeGeneration.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/CodeGeneration.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/CodeGeneration.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/CodeGeneration.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarArithmetic.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarArithmetic.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarArithmetic.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarArithmetic.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarBinaryOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarBoundAttribute.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBoundAttribute.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarBoundAttribute.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBoundAttribute.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarCaseWhenOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarCaseWhenOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarCaseWhenOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarCaseWhenOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarCoalesceOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarCoalesceOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarCoalesceOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarCoalesceOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarConcatOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarConcatOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarConcatOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarConcatOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarConditionProjector.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarConditionProjector.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarConditionProjector.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarConditionProjector.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarConditionedProbeJoin.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarConditionedProbeJoin.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarConditionedProbeJoin.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarConditionedProbeJoin.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarExpression.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarExpression.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarExpression.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarExpression.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarFilter.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarFilter.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarFilter.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarFilter.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarHashAggregation.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarHashAggregation.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarHashAggregation.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarHashAggregation.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarIfOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarIfOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarIfOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarIfOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarInOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarInOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarInOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarInOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarInSetOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarInSetOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarInSetOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarInSetOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarLiterals.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarLiterals.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarLiterals.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarLiterals.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarNamedExpressions.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarNamedExpressions.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarNamedExpressions.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarNamedExpressions.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarProjection.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarProjection.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarProjection.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarProjection.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarRoundOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarRoundOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarRoundOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarRoundOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarSortMergeJoin.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarSortMergeJoin.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarSortMergeJoin.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarSortMergeJoin.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarSorter.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarSorter.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarSorter.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarSorter.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarSubquery.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarSubquery.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarSubquery.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarSubquery.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ColumnarUnaryOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarUnaryOperator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ColumnarUnaryOperator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarUnaryOperator.scala diff --git a/core/src/main/scala/com/intel/oap/expression/ConverterUtils.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ConverterUtils.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/expression/ConverterUtils.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/expression/ConverterUtils.scala diff --git a/core/src/main/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializer.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializer.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializer.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializer.scala diff --git a/core/src/main/scala/com/intel/oap/vectorized/CloseableColumnBatchIterator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/vectorized/CloseableColumnBatchIterator.scala similarity index 100% rename from core/src/main/scala/com/intel/oap/vectorized/CloseableColumnBatchIterator.scala rename to native-sql-engine/core/src/main/scala/com/intel/oap/vectorized/CloseableColumnBatchIterator.scala diff --git a/core/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleDependency.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleDependency.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleDependency.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleDependency.scala diff --git a/core/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleWriter.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleWriter.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleWriter.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/shuffle/ColumnarShuffleWriter.scala diff --git a/core/src/main/scala/org/apache/spark/shuffle/sort/ColumnarShuffleManager.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/shuffle/sort/ColumnarShuffleManager.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/shuffle/sort/ColumnarShuffleManager.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/shuffle/sort/ColumnarShuffleManager.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/ColumnarCollapseCodegenStages.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarCollapseCodegenStages.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/ColumnarCollapseCodegenStages.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarCollapseCodegenStages.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/ColumnarExchange.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarExchange.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/ColumnarExchange.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarExchange.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/ColumnarHashedRelation.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarHashedRelation.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/ColumnarHashedRelation.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarHashedRelation.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/adaptive/ColumnarCustomShuffleReaderExec.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/adaptive/ColumnarCustomShuffleReaderExec.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/adaptive/ColumnarCustomShuffleReaderExec.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/adaptive/ColumnarCustomShuffleReaderExec.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/adaptive/QueryStageExec.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/adaptive/QueryStageExec.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/adaptive/QueryStageExec.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/adaptive/QueryStageExec.scala diff --git a/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/VectorizedFilePartitionReaderHandler.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/VectorizedFilePartitionReaderHandler.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/VectorizedFilePartitionReaderHandler.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/VectorizedFilePartitionReaderHandler.scala diff --git a/core/src/main/scala/org/apache/spark/sql/util/ArrowUtils.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/util/ArrowUtils.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/util/ArrowUtils.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/util/ArrowUtils.scala diff --git a/core/src/main/scala/org/apache/spark/sql/util/OASPackageBridge.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/util/OASPackageBridge.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/util/OASPackageBridge.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/util/OASPackageBridge.scala diff --git a/core/src/main/scala/org/apache/spark/sql/util/StructTypeFWD.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/sql/util/StructTypeFWD.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/sql/util/StructTypeFWD.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/sql/util/StructTypeFWD.scala diff --git a/core/src/main/scala/org/apache/spark/util/ExecutorManager.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/util/ExecutorManager.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/util/ExecutorManager.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/util/ExecutorManager.scala diff --git a/core/src/main/scala/org/apache/spark/util/UserAddedJarUtils.scala b/native-sql-engine/core/src/main/scala/org/apache/spark/util/UserAddedJarUtils.scala similarity index 100% rename from core/src/main/scala/org/apache/spark/util/UserAddedJarUtils.scala rename to native-sql-engine/core/src/main/scala/org/apache/spark/util/UserAddedJarUtils.scala diff --git a/core/src/test/java/com/intel/oap/datasource/parquet/ParquetReadTest.java b/native-sql-engine/core/src/test/java/com/intel/oap/datasource/parquet/ParquetReadTest.java similarity index 100% rename from core/src/test/java/com/intel/oap/datasource/parquet/ParquetReadTest.java rename to native-sql-engine/core/src/test/java/com/intel/oap/datasource/parquet/ParquetReadTest.java diff --git a/core/src/test/java/com/intel/oap/datasource/parquet/ParquetReadWriteTest.java b/native-sql-engine/core/src/test/java/com/intel/oap/datasource/parquet/ParquetReadWriteTest.java similarity index 100% rename from core/src/test/java/com/intel/oap/datasource/parquet/ParquetReadWriteTest.java rename to native-sql-engine/core/src/test/java/com/intel/oap/datasource/parquet/ParquetReadWriteTest.java diff --git a/core/src/test/java/com/intel/oap/datasource/parquet/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet b/native-sql-engine/core/src/test/java/com/intel/oap/datasource/parquet/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet similarity index 100% rename from core/src/test/java/com/intel/oap/datasource/parquet/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet rename to native-sql-engine/core/src/test/java/com/intel/oap/datasource/parquet/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet diff --git a/core/src/test/java/com/intel/oap/tpc/MallocUtils.java b/native-sql-engine/core/src/test/java/com/intel/oap/tpc/MallocUtils.java similarity index 100% rename from core/src/test/java/com/intel/oap/tpc/MallocUtils.java rename to native-sql-engine/core/src/test/java/com/intel/oap/tpc/MallocUtils.java diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/metadata b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/metadata similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/metadata rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/metadata diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/offsets/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/0/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/1/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/2/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/3/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/4/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/5/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/6/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/7/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/8/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.1.0/state/0/9/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/commits/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/metadata b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/metadata similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/metadata rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/metadata diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/offsets/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/0/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/1/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/2/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/3/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-flatMapGroupsWithState-state-format-1/state/0/4/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/commits/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/metadata b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/metadata similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/metadata rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/metadata diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-for-multi-watermark-policy/offsets/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/commits/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/metadata b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/metadata similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/metadata rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/metadata diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/offsets/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/0/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/1/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/2/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/3/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-streaming-aggregate-state-format-1/state/0/4/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/commits/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/metadata b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/metadata similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/metadata rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/metadata diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/1 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/1 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/1 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/offsets/1 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/0/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/1/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/2/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/3/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/2.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/2.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/2.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.3.1-without-commit-log-metadata/state/0/4/2.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/commits/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/commits/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/commits/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/commits/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/metadata b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/metadata similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/metadata rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/metadata diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/offsets/0 b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/offsets/0 similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/offsets/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/offsets/0 diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/left-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/0/right-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/left-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/1/right-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/left-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/2/right-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/left-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/3/right-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/left-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyToNumValues/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyToNumValues/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyToNumValues/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyToNumValues/1.delta diff --git a/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyWithIndexToValue/1.delta b/native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyWithIndexToValue/1.delta similarity index 100% rename from core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyWithIndexToValue/1.delta rename to native-sql-engine/core/src/test/resources/structured-streaming/checkpoint-version-2.4.0-streaming-join/state/0/4/right-keyWithIndexToValue/1.delta diff --git a/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/commits/0 b/native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/commits/0 similarity index 100% rename from core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/commits/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/commits/0 diff --git a/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/metadata b/native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/metadata similarity index 100% rename from core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/metadata rename to native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/metadata diff --git a/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/offsets/0 b/native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/offsets/0 similarity index 100% rename from core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/offsets/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/chk%252520%252525@%252523chk/offsets/0 diff --git a/core/src/test/resources/structured-streaming/escaped-path-2.4.0/output %@#output/part-00000-97f675a2-bb82-4201-8245-05f3dae4c372-c000.snappy.parquet b/native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/output %@#output/part-00000-97f675a2-bb82-4201-8245-05f3dae4c372-c000.snappy.parquet similarity index 100% rename from core/src/test/resources/structured-streaming/escaped-path-2.4.0/output %@#output/part-00000-97f675a2-bb82-4201-8245-05f3dae4c372-c000.snappy.parquet rename to native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/output %@#output/part-00000-97f675a2-bb82-4201-8245-05f3dae4c372-c000.snappy.parquet diff --git a/core/src/test/resources/structured-streaming/escaped-path-2.4.0/output%20%25@%23output/_spark_metadata/0 b/native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/output%20%25@%23output/_spark_metadata/0 similarity index 100% rename from core/src/test/resources/structured-streaming/escaped-path-2.4.0/output%20%25@%23output/_spark_metadata/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/escaped-path-2.4.0/output%20%25@%23output/_spark_metadata/0 diff --git a/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/7.compact b/native-sql-engine/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/7.compact similarity index 100% rename from core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/7.compact rename to native-sql-engine/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/7.compact diff --git a/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/8 b/native-sql-engine/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/8 similarity index 100% rename from core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/8 rename to native-sql-engine/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/8 diff --git a/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/9 b/native-sql-engine/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/9 similarity index 100% rename from core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/9 rename to native-sql-engine/core/src/test/resources/structured-streaming/file-sink-log-version-2.1.0/9 diff --git a/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/2.compact b/native-sql-engine/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/2.compact similarity index 100% rename from core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/2.compact rename to native-sql-engine/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/2.compact diff --git a/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/3 b/native-sql-engine/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/3 similarity index 100% rename from core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/3 rename to native-sql-engine/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/3 diff --git a/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/4 b/native-sql-engine/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/4 similarity index 100% rename from core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/4 rename to native-sql-engine/core/src/test/resources/structured-streaming/file-source-log-version-2.1.0/4 diff --git a/core/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-json.txt b/native-sql-engine/core/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-json.txt similarity index 100% rename from core/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-json.txt rename to native-sql-engine/core/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-json.txt diff --git a/core/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-long.txt b/native-sql-engine/core/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-long.txt similarity index 100% rename from core/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-long.txt rename to native-sql-engine/core/src/test/resources/structured-streaming/file-source-offset-version-2.1.0-long.txt diff --git a/core/src/test/resources/structured-streaming/offset-log-version-2.1.0/0 b/native-sql-engine/core/src/test/resources/structured-streaming/offset-log-version-2.1.0/0 similarity index 100% rename from core/src/test/resources/structured-streaming/offset-log-version-2.1.0/0 rename to native-sql-engine/core/src/test/resources/structured-streaming/offset-log-version-2.1.0/0 diff --git a/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.0.txt b/native-sql-engine/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.0.txt similarity index 100% rename from core/src/test/resources/structured-streaming/query-event-logs-version-2.0.0.txt rename to native-sql-engine/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.0.txt diff --git a/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.1.txt b/native-sql-engine/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.1.txt similarity index 100% rename from core/src/test/resources/structured-streaming/query-event-logs-version-2.0.1.txt rename to native-sql-engine/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.1.txt diff --git a/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.2.txt b/native-sql-engine/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.2.txt similarity index 100% rename from core/src/test/resources/structured-streaming/query-event-logs-version-2.0.2.txt rename to native-sql-engine/core/src/test/resources/structured-streaming/query-event-logs-version-2.0.2.txt diff --git a/core/src/test/resources/structured-streaming/query-metadata-logs-version-2.1.0.txt b/native-sql-engine/core/src/test/resources/structured-streaming/query-metadata-logs-version-2.1.0.txt similarity index 100% rename from core/src/test/resources/structured-streaming/query-metadata-logs-version-2.1.0.txt rename to native-sql-engine/core/src/test/resources/structured-streaming/query-metadata-logs-version-2.1.0.txt diff --git a/core/src/test/resources/test-data/bad_after_good.csv b/native-sql-engine/core/src/test/resources/test-data/bad_after_good.csv similarity index 100% rename from core/src/test/resources/test-data/bad_after_good.csv rename to native-sql-engine/core/src/test/resources/test-data/bad_after_good.csv diff --git a/core/src/test/resources/test-data/before_1582_date_v2_4.snappy.orc b/native-sql-engine/core/src/test/resources/test-data/before_1582_date_v2_4.snappy.orc similarity index 100% rename from core/src/test/resources/test-data/before_1582_date_v2_4.snappy.orc rename to native-sql-engine/core/src/test/resources/test-data/before_1582_date_v2_4.snappy.orc diff --git a/core/src/test/resources/test-data/before_1582_date_v2_4.snappy.parquet b/native-sql-engine/core/src/test/resources/test-data/before_1582_date_v2_4.snappy.parquet similarity index 100% rename from core/src/test/resources/test-data/before_1582_date_v2_4.snappy.parquet rename to native-sql-engine/core/src/test/resources/test-data/before_1582_date_v2_4.snappy.parquet diff --git a/core/src/test/resources/test-data/before_1582_timestamp_int96_v2_4.snappy.parquet b/native-sql-engine/core/src/test/resources/test-data/before_1582_timestamp_int96_v2_4.snappy.parquet similarity index 100% rename from core/src/test/resources/test-data/before_1582_timestamp_int96_v2_4.snappy.parquet rename to native-sql-engine/core/src/test/resources/test-data/before_1582_timestamp_int96_v2_4.snappy.parquet diff --git a/core/src/test/resources/test-data/before_1582_timestamp_micros_v2_4.snappy.parquet b/native-sql-engine/core/src/test/resources/test-data/before_1582_timestamp_micros_v2_4.snappy.parquet similarity index 100% rename from core/src/test/resources/test-data/before_1582_timestamp_micros_v2_4.snappy.parquet rename to native-sql-engine/core/src/test/resources/test-data/before_1582_timestamp_micros_v2_4.snappy.parquet diff --git a/core/src/test/resources/test-data/before_1582_timestamp_millis_v2_4.snappy.parquet b/native-sql-engine/core/src/test/resources/test-data/before_1582_timestamp_millis_v2_4.snappy.parquet similarity index 100% rename from core/src/test/resources/test-data/before_1582_timestamp_millis_v2_4.snappy.parquet rename to native-sql-engine/core/src/test/resources/test-data/before_1582_timestamp_millis_v2_4.snappy.parquet diff --git a/core/src/test/resources/test-data/before_1582_ts_v2_4.snappy.orc b/native-sql-engine/core/src/test/resources/test-data/before_1582_ts_v2_4.snappy.orc similarity index 100% rename from core/src/test/resources/test-data/before_1582_ts_v2_4.snappy.orc rename to native-sql-engine/core/src/test/resources/test-data/before_1582_ts_v2_4.snappy.orc diff --git a/core/src/test/resources/test-data/bool.csv b/native-sql-engine/core/src/test/resources/test-data/bool.csv similarity index 100% rename from core/src/test/resources/test-data/bool.csv rename to native-sql-engine/core/src/test/resources/test-data/bool.csv diff --git a/core/src/test/resources/test-data/cars-alternative.csv b/native-sql-engine/core/src/test/resources/test-data/cars-alternative.csv similarity index 100% rename from core/src/test/resources/test-data/cars-alternative.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-alternative.csv diff --git a/core/src/test/resources/test-data/cars-blank-column-name.csv b/native-sql-engine/core/src/test/resources/test-data/cars-blank-column-name.csv similarity index 100% rename from core/src/test/resources/test-data/cars-blank-column-name.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-blank-column-name.csv diff --git a/core/src/test/resources/test-data/cars-crlf.csv b/native-sql-engine/core/src/test/resources/test-data/cars-crlf.csv similarity index 100% rename from core/src/test/resources/test-data/cars-crlf.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-crlf.csv diff --git a/core/src/test/resources/test-data/cars-empty-value.csv b/native-sql-engine/core/src/test/resources/test-data/cars-empty-value.csv similarity index 100% rename from core/src/test/resources/test-data/cars-empty-value.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-empty-value.csv diff --git a/core/src/test/resources/test-data/cars-malformed.csv b/native-sql-engine/core/src/test/resources/test-data/cars-malformed.csv similarity index 100% rename from core/src/test/resources/test-data/cars-malformed.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-malformed.csv diff --git a/core/src/test/resources/test-data/cars-multichar-delim-crazy.csv b/native-sql-engine/core/src/test/resources/test-data/cars-multichar-delim-crazy.csv similarity index 100% rename from core/src/test/resources/test-data/cars-multichar-delim-crazy.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-multichar-delim-crazy.csv diff --git a/core/src/test/resources/test-data/cars-multichar-delim.csv b/native-sql-engine/core/src/test/resources/test-data/cars-multichar-delim.csv similarity index 100% rename from core/src/test/resources/test-data/cars-multichar-delim.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-multichar-delim.csv diff --git a/core/src/test/resources/test-data/cars-null.csv b/native-sql-engine/core/src/test/resources/test-data/cars-null.csv similarity index 100% rename from core/src/test/resources/test-data/cars-null.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-null.csv diff --git a/core/src/test/resources/test-data/cars-unbalanced-quotes.csv b/native-sql-engine/core/src/test/resources/test-data/cars-unbalanced-quotes.csv similarity index 100% rename from core/src/test/resources/test-data/cars-unbalanced-quotes.csv rename to native-sql-engine/core/src/test/resources/test-data/cars-unbalanced-quotes.csv diff --git a/native-sql-engine/core/src/test/resources/test-data/cars.csv b/native-sql-engine/core/src/test/resources/test-data/cars.csv new file mode 100644 index 000000000..40ded573a --- /dev/null +++ b/native-sql-engine/core/src/test/resources/test-data/cars.csv @@ -0,0 +1,7 @@ + +year,make,model,comment,blank +"2012","Tesla","S","No comment", + +1997,Ford,E350,"Go get one now they are going fast", +2015,Chevy,Volt + diff --git a/core/src/test/resources/test-data/cars.tsv b/native-sql-engine/core/src/test/resources/test-data/cars.tsv similarity index 100% rename from core/src/test/resources/test-data/cars.tsv rename to native-sql-engine/core/src/test/resources/test-data/cars.tsv diff --git a/core/src/test/resources/test-data/cars_iso-8859-1.csv b/native-sql-engine/core/src/test/resources/test-data/cars_iso-8859-1.csv similarity index 100% rename from core/src/test/resources/test-data/cars_iso-8859-1.csv rename to native-sql-engine/core/src/test/resources/test-data/cars_iso-8859-1.csv diff --git a/core/src/test/resources/test-data/comments-whitespaces.csv b/native-sql-engine/core/src/test/resources/test-data/comments-whitespaces.csv similarity index 100% rename from core/src/test/resources/test-data/comments-whitespaces.csv rename to native-sql-engine/core/src/test/resources/test-data/comments-whitespaces.csv diff --git a/core/src/test/resources/test-data/comments.csv b/native-sql-engine/core/src/test/resources/test-data/comments.csv similarity index 100% rename from core/src/test/resources/test-data/comments.csv rename to native-sql-engine/core/src/test/resources/test-data/comments.csv diff --git a/core/src/test/resources/test-data/dates.csv b/native-sql-engine/core/src/test/resources/test-data/dates.csv similarity index 100% rename from core/src/test/resources/test-data/dates.csv rename to native-sql-engine/core/src/test/resources/test-data/dates.csv diff --git a/core/src/test/resources/test-data/dec-in-fixed-len.parquet b/native-sql-engine/core/src/test/resources/test-data/dec-in-fixed-len.parquet similarity index 100% rename from core/src/test/resources/test-data/dec-in-fixed-len.parquet rename to native-sql-engine/core/src/test/resources/test-data/dec-in-fixed-len.parquet diff --git a/core/src/test/resources/test-data/dec-in-i32.parquet b/native-sql-engine/core/src/test/resources/test-data/dec-in-i32.parquet similarity index 100% rename from core/src/test/resources/test-data/dec-in-i32.parquet rename to native-sql-engine/core/src/test/resources/test-data/dec-in-i32.parquet diff --git a/core/src/test/resources/test-data/dec-in-i64.parquet b/native-sql-engine/core/src/test/resources/test-data/dec-in-i64.parquet similarity index 100% rename from core/src/test/resources/test-data/dec-in-i64.parquet rename to native-sql-engine/core/src/test/resources/test-data/dec-in-i64.parquet diff --git a/core/src/test/resources/test-data/decimal.csv b/native-sql-engine/core/src/test/resources/test-data/decimal.csv similarity index 100% rename from core/src/test/resources/test-data/decimal.csv rename to native-sql-engine/core/src/test/resources/test-data/decimal.csv diff --git a/core/src/test/resources/test-data/disable_comments.csv b/native-sql-engine/core/src/test/resources/test-data/disable_comments.csv similarity index 100% rename from core/src/test/resources/test-data/disable_comments.csv rename to native-sql-engine/core/src/test/resources/test-data/disable_comments.csv diff --git a/core/src/test/resources/test-data/empty.csv b/native-sql-engine/core/src/test/resources/test-data/empty.csv similarity index 100% rename from core/src/test/resources/test-data/empty.csv rename to native-sql-engine/core/src/test/resources/test-data/empty.csv diff --git a/core/src/test/resources/test-data/impala_timestamp.parq b/native-sql-engine/core/src/test/resources/test-data/impala_timestamp.parq similarity index 100% rename from core/src/test/resources/test-data/impala_timestamp.parq rename to native-sql-engine/core/src/test/resources/test-data/impala_timestamp.parq diff --git a/core/src/test/resources/test-data/malformedRow.csv b/native-sql-engine/core/src/test/resources/test-data/malformedRow.csv similarity index 100% rename from core/src/test/resources/test-data/malformedRow.csv rename to native-sql-engine/core/src/test/resources/test-data/malformedRow.csv diff --git a/core/src/test/resources/test-data/native-splitter-output-all-null b/native-sql-engine/core/src/test/resources/test-data/native-splitter-output-all-null similarity index 100% rename from core/src/test/resources/test-data/native-splitter-output-all-null rename to native-sql-engine/core/src/test/resources/test-data/native-splitter-output-all-null diff --git a/core/src/test/resources/test-data/native-splitter-output-nullable-string b/native-sql-engine/core/src/test/resources/test-data/native-splitter-output-nullable-string similarity index 100% rename from core/src/test/resources/test-data/native-splitter-output-nullable-string rename to native-sql-engine/core/src/test/resources/test-data/native-splitter-output-nullable-string diff --git a/core/src/test/resources/test-data/nested-array-struct.parquet b/native-sql-engine/core/src/test/resources/test-data/nested-array-struct.parquet similarity index 100% rename from core/src/test/resources/test-data/nested-array-struct.parquet rename to native-sql-engine/core/src/test/resources/test-data/nested-array-struct.parquet diff --git a/core/src/test/resources/test-data/numbers.csv b/native-sql-engine/core/src/test/resources/test-data/numbers.csv similarity index 100% rename from core/src/test/resources/test-data/numbers.csv rename to native-sql-engine/core/src/test/resources/test-data/numbers.csv diff --git a/core/src/test/resources/test-data/old-repeated-int.parquet b/native-sql-engine/core/src/test/resources/test-data/old-repeated-int.parquet similarity index 100% rename from core/src/test/resources/test-data/old-repeated-int.parquet rename to native-sql-engine/core/src/test/resources/test-data/old-repeated-int.parquet diff --git a/core/src/test/resources/test-data/old-repeated-message.parquet b/native-sql-engine/core/src/test/resources/test-data/old-repeated-message.parquet similarity index 100% rename from core/src/test/resources/test-data/old-repeated-message.parquet rename to native-sql-engine/core/src/test/resources/test-data/old-repeated-message.parquet diff --git a/core/src/test/resources/test-data/parquet-1217.parquet b/native-sql-engine/core/src/test/resources/test-data/parquet-1217.parquet similarity index 100% rename from core/src/test/resources/test-data/parquet-1217.parquet rename to native-sql-engine/core/src/test/resources/test-data/parquet-1217.parquet diff --git a/core/src/test/resources/test-data/parquet-thrift-compat.snappy.parquet b/native-sql-engine/core/src/test/resources/test-data/parquet-thrift-compat.snappy.parquet similarity index 100% rename from core/src/test/resources/test-data/parquet-thrift-compat.snappy.parquet rename to native-sql-engine/core/src/test/resources/test-data/parquet-thrift-compat.snappy.parquet diff --git a/core/src/test/resources/test-data/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet b/native-sql-engine/core/src/test/resources/test-data/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet similarity index 100% rename from core/src/test/resources/test-data/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet rename to native-sql-engine/core/src/test/resources/test-data/part-00000-d648dd34-c9d2-4fe9-87f2-770ef3551442-c000.snappy.parquet diff --git a/core/src/test/resources/test-data/postgresql/agg.data b/native-sql-engine/core/src/test/resources/test-data/postgresql/agg.data similarity index 100% rename from core/src/test/resources/test-data/postgresql/agg.data rename to native-sql-engine/core/src/test/resources/test-data/postgresql/agg.data diff --git a/core/src/test/resources/test-data/postgresql/onek.data b/native-sql-engine/core/src/test/resources/test-data/postgresql/onek.data similarity index 100% rename from core/src/test/resources/test-data/postgresql/onek.data rename to native-sql-engine/core/src/test/resources/test-data/postgresql/onek.data diff --git a/core/src/test/resources/test-data/postgresql/tenk.data b/native-sql-engine/core/src/test/resources/test-data/postgresql/tenk.data similarity index 100% rename from core/src/test/resources/test-data/postgresql/tenk.data rename to native-sql-engine/core/src/test/resources/test-data/postgresql/tenk.data diff --git a/core/src/test/resources/test-data/proto-repeated-string.parquet b/native-sql-engine/core/src/test/resources/test-data/proto-repeated-string.parquet similarity index 100% rename from core/src/test/resources/test-data/proto-repeated-string.parquet rename to native-sql-engine/core/src/test/resources/test-data/proto-repeated-string.parquet diff --git a/core/src/test/resources/test-data/proto-repeated-struct.parquet b/native-sql-engine/core/src/test/resources/test-data/proto-repeated-struct.parquet similarity index 100% rename from core/src/test/resources/test-data/proto-repeated-struct.parquet rename to native-sql-engine/core/src/test/resources/test-data/proto-repeated-struct.parquet diff --git a/core/src/test/resources/test-data/proto-struct-with-array-many.parquet b/native-sql-engine/core/src/test/resources/test-data/proto-struct-with-array-many.parquet similarity index 100% rename from core/src/test/resources/test-data/proto-struct-with-array-many.parquet rename to native-sql-engine/core/src/test/resources/test-data/proto-struct-with-array-many.parquet diff --git a/core/src/test/resources/test-data/proto-struct-with-array.parquet b/native-sql-engine/core/src/test/resources/test-data/proto-struct-with-array.parquet similarity index 100% rename from core/src/test/resources/test-data/proto-struct-with-array.parquet rename to native-sql-engine/core/src/test/resources/test-data/proto-struct-with-array.parquet diff --git a/core/src/test/resources/test-data/simple_sparse.csv b/native-sql-engine/core/src/test/resources/test-data/simple_sparse.csv similarity index 100% rename from core/src/test/resources/test-data/simple_sparse.csv rename to native-sql-engine/core/src/test/resources/test-data/simple_sparse.csv diff --git a/core/src/test/resources/test-data/text-partitioned/year=2014/data.txt b/native-sql-engine/core/src/test/resources/test-data/text-partitioned/year=2014/data.txt similarity index 100% rename from core/src/test/resources/test-data/text-partitioned/year=2014/data.txt rename to native-sql-engine/core/src/test/resources/test-data/text-partitioned/year=2014/data.txt diff --git a/core/src/test/resources/test-data/text-partitioned/year=2015/data.txt b/native-sql-engine/core/src/test/resources/test-data/text-partitioned/year=2015/data.txt similarity index 100% rename from core/src/test/resources/test-data/text-partitioned/year=2015/data.txt rename to native-sql-engine/core/src/test/resources/test-data/text-partitioned/year=2015/data.txt diff --git a/core/src/test/resources/test-data/text-suite.txt b/native-sql-engine/core/src/test/resources/test-data/text-suite.txt similarity index 100% rename from core/src/test/resources/test-data/text-suite.txt rename to native-sql-engine/core/src/test/resources/test-data/text-suite.txt diff --git a/core/src/test/resources/test-data/text-suite2.txt b/native-sql-engine/core/src/test/resources/test-data/text-suite2.txt similarity index 100% rename from core/src/test/resources/test-data/text-suite2.txt rename to native-sql-engine/core/src/test/resources/test-data/text-suite2.txt diff --git a/core/src/test/resources/test-data/timemillis-in-i64.parquet b/native-sql-engine/core/src/test/resources/test-data/timemillis-in-i64.parquet similarity index 100% rename from core/src/test/resources/test-data/timemillis-in-i64.parquet rename to native-sql-engine/core/src/test/resources/test-data/timemillis-in-i64.parquet diff --git a/core/src/test/resources/test-data/unescaped-quotes.csv b/native-sql-engine/core/src/test/resources/test-data/unescaped-quotes.csv similarity index 100% rename from core/src/test/resources/test-data/unescaped-quotes.csv rename to native-sql-engine/core/src/test/resources/test-data/unescaped-quotes.csv diff --git a/core/src/test/resources/test-data/utf16LE.json b/native-sql-engine/core/src/test/resources/test-data/utf16LE.json similarity index 100% rename from core/src/test/resources/test-data/utf16LE.json rename to native-sql-engine/core/src/test/resources/test-data/utf16LE.json diff --git a/core/src/test/resources/test-data/utf16WithBOM.json b/native-sql-engine/core/src/test/resources/test-data/utf16WithBOM.json similarity index 100% rename from core/src/test/resources/test-data/utf16WithBOM.json rename to native-sql-engine/core/src/test/resources/test-data/utf16WithBOM.json diff --git a/core/src/test/resources/test-data/utf32BEWithBOM.json b/native-sql-engine/core/src/test/resources/test-data/utf32BEWithBOM.json similarity index 100% rename from core/src/test/resources/test-data/utf32BEWithBOM.json rename to native-sql-engine/core/src/test/resources/test-data/utf32BEWithBOM.json diff --git a/core/src/test/resources/test-data/value-malformed.csv b/native-sql-engine/core/src/test/resources/test-data/value-malformed.csv similarity index 100% rename from core/src/test/resources/test-data/value-malformed.csv rename to native-sql-engine/core/src/test/resources/test-data/value-malformed.csv diff --git a/core/src/test/resources/test-data/with-array-fields.json b/native-sql-engine/core/src/test/resources/test-data/with-array-fields.json similarity index 100% rename from core/src/test/resources/test-data/with-array-fields.json rename to native-sql-engine/core/src/test/resources/test-data/with-array-fields.json diff --git a/core/src/test/resources/test-data/with-map-fields.json b/native-sql-engine/core/src/test/resources/test-data/with-map-fields.json similarity index 100% rename from core/src/test/resources/test-data/with-map-fields.json rename to native-sql-engine/core/src/test/resources/test-data/with-map-fields.json diff --git a/core/src/test/resources/tpcds-queries/q1.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q1.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q1.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q1.sql diff --git a/core/src/test/resources/tpcds-queries/q10.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q10.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q10.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q10.sql diff --git a/core/src/test/resources/tpcds-queries/q11.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q11.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q11.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q11.sql diff --git a/core/src/test/resources/tpcds-queries/q12.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q12.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q12.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q12.sql diff --git a/core/src/test/resources/tpcds-queries/q13.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q13.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q13.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q13.sql diff --git a/core/src/test/resources/tpcds-queries/q14a.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q14a.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q14a.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q14a.sql diff --git a/core/src/test/resources/tpcds-queries/q14b.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q14b.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q14b.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q14b.sql diff --git a/core/src/test/resources/tpcds-queries/q15.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q15.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q15.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q15.sql diff --git a/core/src/test/resources/tpcds-queries/q16.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q16.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q16.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q16.sql diff --git a/core/src/test/resources/tpcds-queries/q17.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q17.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q17.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q17.sql diff --git a/core/src/test/resources/tpcds-queries/q18.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q18.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q18.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q18.sql diff --git a/core/src/test/resources/tpcds-queries/q19.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q19.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q19.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q19.sql diff --git a/core/src/test/resources/tpcds-queries/q2.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q2.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q2.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q2.sql diff --git a/core/src/test/resources/tpcds-queries/q20.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q20.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q20.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q20.sql diff --git a/core/src/test/resources/tpcds-queries/q21.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q21.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q21.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q21.sql diff --git a/core/src/test/resources/tpcds-queries/q22.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q22.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q22.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q22.sql diff --git a/core/src/test/resources/tpcds-queries/q23a.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q23a.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q23a.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q23a.sql diff --git a/core/src/test/resources/tpcds-queries/q23b.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q23b.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q23b.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q23b.sql diff --git a/core/src/test/resources/tpcds-queries/q24a.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q24a.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q24a.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q24a.sql diff --git a/core/src/test/resources/tpcds-queries/q24b.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q24b.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q24b.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q24b.sql diff --git a/core/src/test/resources/tpcds-queries/q25.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q25.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q25.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q25.sql diff --git a/core/src/test/resources/tpcds-queries/q26.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q26.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q26.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q26.sql diff --git a/core/src/test/resources/tpcds-queries/q27.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q27.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q27.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q27.sql diff --git a/core/src/test/resources/tpcds-queries/q28.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q28.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q28.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q28.sql diff --git a/core/src/test/resources/tpcds-queries/q29.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q29.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q29.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q29.sql diff --git a/core/src/test/resources/tpcds-queries/q3.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q3.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q3.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q3.sql diff --git a/core/src/test/resources/tpcds-queries/q30.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q30.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q30.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q30.sql diff --git a/core/src/test/resources/tpcds-queries/q31.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q31.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q31.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q31.sql diff --git a/core/src/test/resources/tpcds-queries/q32.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q32.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q32.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q32.sql diff --git a/core/src/test/resources/tpcds-queries/q33.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q33.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q33.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q33.sql diff --git a/core/src/test/resources/tpcds-queries/q34.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q34.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q34.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q34.sql diff --git a/core/src/test/resources/tpcds-queries/q35.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q35.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q35.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q35.sql diff --git a/core/src/test/resources/tpcds-queries/q36.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q36.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q36.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q36.sql diff --git a/core/src/test/resources/tpcds-queries/q37.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q37.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q37.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q37.sql diff --git a/core/src/test/resources/tpcds-queries/q38.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q38.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q38.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q38.sql diff --git a/core/src/test/resources/tpcds-queries/q39a.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q39a.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q39a.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q39a.sql diff --git a/core/src/test/resources/tpcds-queries/q39b.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q39b.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q39b.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q39b.sql diff --git a/core/src/test/resources/tpcds-queries/q4.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q4.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q4.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q4.sql diff --git a/core/src/test/resources/tpcds-queries/q40.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q40.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q40.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q40.sql diff --git a/core/src/test/resources/tpcds-queries/q41.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q41.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q41.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q41.sql diff --git a/core/src/test/resources/tpcds-queries/q42.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q42.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q42.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q42.sql diff --git a/core/src/test/resources/tpcds-queries/q43.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q43.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q43.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q43.sql diff --git a/core/src/test/resources/tpcds-queries/q44.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q44.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q44.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q44.sql diff --git a/core/src/test/resources/tpcds-queries/q45.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q45.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q45.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q45.sql diff --git a/core/src/test/resources/tpcds-queries/q46.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q46.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q46.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q46.sql diff --git a/core/src/test/resources/tpcds-queries/q47.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q47.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q47.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q47.sql diff --git a/core/src/test/resources/tpcds-queries/q48.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q48.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q48.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q48.sql diff --git a/core/src/test/resources/tpcds-queries/q49.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q49.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q49.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q49.sql diff --git a/core/src/test/resources/tpcds-queries/q5.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q5.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q5.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q5.sql diff --git a/core/src/test/resources/tpcds-queries/q50.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q50.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q50.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q50.sql diff --git a/core/src/test/resources/tpcds-queries/q51.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q51.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q51.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q51.sql diff --git a/core/src/test/resources/tpcds-queries/q52.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q52.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q52.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q52.sql diff --git a/core/src/test/resources/tpcds-queries/q53.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q53.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q53.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q53.sql diff --git a/core/src/test/resources/tpcds-queries/q54.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q54.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q54.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q54.sql diff --git a/core/src/test/resources/tpcds-queries/q55.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q55.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q55.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q55.sql diff --git a/core/src/test/resources/tpcds-queries/q56.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q56.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q56.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q56.sql diff --git a/core/src/test/resources/tpcds-queries/q57.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q57.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q57.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q57.sql diff --git a/core/src/test/resources/tpcds-queries/q58.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q58.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q58.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q58.sql diff --git a/core/src/test/resources/tpcds-queries/q59.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q59.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q59.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q59.sql diff --git a/core/src/test/resources/tpcds-queries/q6.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q6.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q6.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q6.sql diff --git a/core/src/test/resources/tpcds-queries/q60.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q60.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q60.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q60.sql diff --git a/core/src/test/resources/tpcds-queries/q61.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q61.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q61.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q61.sql diff --git a/core/src/test/resources/tpcds-queries/q62.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q62.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q62.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q62.sql diff --git a/core/src/test/resources/tpcds-queries/q63.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q63.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q63.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q63.sql diff --git a/core/src/test/resources/tpcds-queries/q64.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q64.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q64.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q64.sql diff --git a/core/src/test/resources/tpcds-queries/q65.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q65.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q65.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q65.sql diff --git a/core/src/test/resources/tpcds-queries/q66.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q66.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q66.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q66.sql diff --git a/core/src/test/resources/tpcds-queries/q67.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q67.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q67.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q67.sql diff --git a/core/src/test/resources/tpcds-queries/q68.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q68.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q68.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q68.sql diff --git a/core/src/test/resources/tpcds-queries/q69.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q69.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q69.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q69.sql diff --git a/core/src/test/resources/tpcds-queries/q7.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q7.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q7.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q7.sql diff --git a/core/src/test/resources/tpcds-queries/q70.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q70.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q70.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q70.sql diff --git a/core/src/test/resources/tpcds-queries/q71.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q71.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q71.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q71.sql diff --git a/core/src/test/resources/tpcds-queries/q72.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q72.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q72.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q72.sql diff --git a/core/src/test/resources/tpcds-queries/q73.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q73.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q73.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q73.sql diff --git a/core/src/test/resources/tpcds-queries/q74.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q74.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q74.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q74.sql diff --git a/core/src/test/resources/tpcds-queries/q75.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q75.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q75.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q75.sql diff --git a/core/src/test/resources/tpcds-queries/q76.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q76.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q76.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q76.sql diff --git a/core/src/test/resources/tpcds-queries/q77.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q77.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q77.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q77.sql diff --git a/core/src/test/resources/tpcds-queries/q78.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q78.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q78.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q78.sql diff --git a/core/src/test/resources/tpcds-queries/q79.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q79.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q79.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q79.sql diff --git a/core/src/test/resources/tpcds-queries/q8.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q8.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q8.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q8.sql diff --git a/core/src/test/resources/tpcds-queries/q80.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q80.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q80.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q80.sql diff --git a/core/src/test/resources/tpcds-queries/q81.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q81.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q81.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q81.sql diff --git a/core/src/test/resources/tpcds-queries/q82.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q82.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q82.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q82.sql diff --git a/core/src/test/resources/tpcds-queries/q83.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q83.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q83.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q83.sql diff --git a/core/src/test/resources/tpcds-queries/q84.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q84.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q84.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q84.sql diff --git a/core/src/test/resources/tpcds-queries/q85.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q85.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q85.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q85.sql diff --git a/core/src/test/resources/tpcds-queries/q86.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q86.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q86.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q86.sql diff --git a/core/src/test/resources/tpcds-queries/q87.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q87.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q87.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q87.sql diff --git a/core/src/test/resources/tpcds-queries/q88.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q88.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q88.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q88.sql diff --git a/core/src/test/resources/tpcds-queries/q89.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q89.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q89.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q89.sql diff --git a/core/src/test/resources/tpcds-queries/q9.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q9.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q9.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q9.sql diff --git a/core/src/test/resources/tpcds-queries/q90.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q90.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q90.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q90.sql diff --git a/core/src/test/resources/tpcds-queries/q91.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q91.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q91.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q91.sql diff --git a/core/src/test/resources/tpcds-queries/q92.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q92.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q92.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q92.sql diff --git a/core/src/test/resources/tpcds-queries/q93.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q93.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q93.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q93.sql diff --git a/core/src/test/resources/tpcds-queries/q94.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q94.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q94.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q94.sql diff --git a/core/src/test/resources/tpcds-queries/q95.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q95.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q95.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q95.sql diff --git a/core/src/test/resources/tpcds-queries/q96.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q96.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q96.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q96.sql diff --git a/core/src/test/resources/tpcds-queries/q97.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q97.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q97.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q97.sql diff --git a/core/src/test/resources/tpcds-queries/q98.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q98.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q98.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q98.sql diff --git a/core/src/test/resources/tpcds-queries/q99.sql b/native-sql-engine/core/src/test/resources/tpcds-queries/q99.sql similarity index 100% rename from core/src/test/resources/tpcds-queries/q99.sql rename to native-sql-engine/core/src/test/resources/tpcds-queries/q99.sql diff --git a/core/src/test/resources/tpch-queries/q1.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q1.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q1.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q1.sql diff --git a/core/src/test/resources/tpch-queries/q10.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q10.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q10.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q10.sql diff --git a/core/src/test/resources/tpch-queries/q11.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q11.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q11.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q11.sql diff --git a/core/src/test/resources/tpch-queries/q12.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q12.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q12.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q12.sql diff --git a/core/src/test/resources/tpch-queries/q13.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q13.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q13.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q13.sql diff --git a/core/src/test/resources/tpch-queries/q14.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q14.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q14.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q14.sql diff --git a/core/src/test/resources/tpch-queries/q15.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q15.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q15.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q15.sql diff --git a/core/src/test/resources/tpch-queries/q16.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q16.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q16.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q16.sql diff --git a/core/src/test/resources/tpch-queries/q17.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q17.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q17.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q17.sql diff --git a/core/src/test/resources/tpch-queries/q18.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q18.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q18.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q18.sql diff --git a/core/src/test/resources/tpch-queries/q19.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q19.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q19.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q19.sql diff --git a/core/src/test/resources/tpch-queries/q2.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q2.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q2.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q2.sql diff --git a/core/src/test/resources/tpch-queries/q20.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q20.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q20.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q20.sql diff --git a/core/src/test/resources/tpch-queries/q21.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q21.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q21.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q21.sql diff --git a/core/src/test/resources/tpch-queries/q22.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q22.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q22.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q22.sql diff --git a/core/src/test/resources/tpch-queries/q3.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q3.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q3.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q3.sql diff --git a/core/src/test/resources/tpch-queries/q4.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q4.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q4.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q4.sql diff --git a/core/src/test/resources/tpch-queries/q5.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q5.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q5.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q5.sql diff --git a/core/src/test/resources/tpch-queries/q6.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q6.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q6.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q6.sql diff --git a/core/src/test/resources/tpch-queries/q7.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q7.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q7.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q7.sql diff --git a/core/src/test/resources/tpch-queries/q8.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q8.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q8.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q8.sql diff --git a/core/src/test/resources/tpch-queries/q9.sql b/native-sql-engine/core/src/test/resources/tpch-queries/q9.sql similarity index 100% rename from core/src/test/resources/tpch-queries/q9.sql rename to native-sql-engine/core/src/test/resources/tpch-queries/q9.sql diff --git a/core/src/test/scala/com/intel/oap/tags/BroadcastHashJoinMode.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tags/BroadcastHashJoinMode.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tags/BroadcastHashJoinMode.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tags/BroadcastHashJoinMode.scala diff --git a/core/src/test/scala/com/intel/oap/tags/CommentOnContextPR.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tags/CommentOnContextPR.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tags/CommentOnContextPR.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tags/CommentOnContextPR.scala diff --git a/core/src/test/scala/com/intel/oap/tags/SortMergeJoinMode.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tags/SortMergeJoinMode.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tags/SortMergeJoinMode.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tags/SortMergeJoinMode.scala diff --git a/core/src/test/scala/com/intel/oap/tags/TestAndWriteLogs.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tags/TestAndWriteLogs.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tags/TestAndWriteLogs.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tags/TestAndWriteLogs.scala diff --git a/core/src/test/scala/com/intel/oap/tpc/TableGen.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tpc/TableGen.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tpc/TableGen.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tpc/TableGen.scala diff --git a/core/src/test/scala/com/intel/oap/tpc/ds/TPCDSSuite.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tpc/ds/TPCDSSuite.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tpc/ds/TPCDSSuite.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tpc/ds/TPCDSSuite.scala diff --git a/core/src/test/scala/com/intel/oap/tpc/ds/TPCDSTableGen.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tpc/ds/TPCDSTableGen.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tpc/ds/TPCDSTableGen.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tpc/ds/TPCDSTableGen.scala diff --git a/core/src/test/scala/com/intel/oap/tpc/h/GitHubActionEntries.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tpc/h/GitHubActionEntries.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tpc/h/GitHubActionEntries.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tpc/h/GitHubActionEntries.scala diff --git a/core/src/test/scala/com/intel/oap/tpc/h/TPCHSuite.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tpc/h/TPCHSuite.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tpc/h/TPCHSuite.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tpc/h/TPCHSuite.scala diff --git a/core/src/test/scala/com/intel/oap/tpc/h/TPCHTableGen.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tpc/h/TPCHTableGen.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tpc/h/TPCHTableGen.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tpc/h/TPCHTableGen.scala diff --git a/core/src/test/scala/com/intel/oap/tpc/util/TPCRunner.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/tpc/util/TPCRunner.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/tpc/util/TPCRunner.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/tpc/util/TPCRunner.scala diff --git a/core/src/test/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializerSuite.scala b/native-sql-engine/core/src/test/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializerSuite.scala similarity index 100% rename from core/src/test/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializerSuite.scala rename to native-sql-engine/core/src/test/scala/com/intel/oap/vectorized/ArrowColumnarBatchSerializerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/shuffle/ColumnarShuffleWriterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/shuffle/ColumnarShuffleWriterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/shuffle/ColumnarShuffleWriterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/shuffle/ColumnarShuffleWriterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/AggregateHashMapSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/AggregateHashMapSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/AggregateHashMapSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/AggregateHashMapSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ApproxCountDistinctForIntervalsQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ApproxCountDistinctForIntervalsQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ApproxCountDistinctForIntervalsQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ApproxCountDistinctForIntervalsQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ApproximatePercentileQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ApproximatePercentileQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ApproximatePercentileQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ApproximatePercentileQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/BenchmarkQueryTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/BenchmarkQueryTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/BenchmarkQueryTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/BenchmarkQueryTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/CachedTableSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/CachedTableSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/CachedTableSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/CachedTableSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ColumnExpressionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ComplexTypesSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ComplexTypesSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ComplexTypesSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ComplexTypesSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ConfigBehaviorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ConfigBehaviorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ConfigBehaviorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ConfigBehaviorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/CountMinSketchAggQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/CountMinSketchAggQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/CountMinSketchAggQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/CountMinSketchAggQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/CsvFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/CsvFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/CsvFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/CsvFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameComplexTypeSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameComplexTypeSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameComplexTypeSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameComplexTypeSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameHintSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameHintSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameHintSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameHintSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameImplicitsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameImplicitsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameImplicitsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameImplicitsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameJoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameJoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameJoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameJoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameNaFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameNaFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameNaFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameNaFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFramePivotSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameRangeSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameRangeSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameRangeSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameRangeSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameSelfJoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameSelfJoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameSelfJoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameSelfJoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameSetOperationsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameSetOperationsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameSetOperationsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameSetOperationsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameStatSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameStatSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameStatSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameStatSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameTimeWindowingSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameTimeWindowingSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameTimeWindowingSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameTimeWindowingSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameTungstenSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameTungstenSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameTungstenSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameTungstenSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameWindowFramesSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameWindowFramesSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameWindowFramesSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameWindowFramesSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameWindowFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameWindowFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameWindowFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameWindowFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DataFrameWriterV2Suite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameWriterV2Suite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DataFrameWriterV2Suite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DataFrameWriterV2Suite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DatasetAggregatorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetAggregatorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DatasetAggregatorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetAggregatorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DatasetCacheSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetCacheSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DatasetCacheSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetCacheSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DatasetOptimizationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetOptimizationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DatasetOptimizationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetOptimizationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DatasetPrimitiveSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetPrimitiveSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DatasetPrimitiveSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetPrimitiveSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DatasetSerializerRegistratorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetSerializerRegistratorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DatasetSerializerRegistratorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetSerializerRegistratorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DatasetSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DatasetSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DatasetSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DateFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DeprecatedAPISuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DeprecatedAPISuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DeprecatedAPISuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DeprecatedAPISuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DeprecatedDatasetAggregatorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DeprecatedDatasetAggregatorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DeprecatedDatasetAggregatorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DeprecatedDatasetAggregatorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/DynamicPartitionPruningSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/DynamicPartitionPruningSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/DynamicPartitionPruningSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/DynamicPartitionPruningSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ExplainSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ExplainSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ExplainSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ExplainSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ExpressionsSchemaSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ExpressionsSchemaSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ExpressionsSchemaSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ExpressionsSchemaSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ExtraStrategiesSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ExtraStrategiesSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ExtraStrategiesSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ExtraStrategiesSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/FileBasedDataSourceSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/FileBasedDataSourceSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/FileBasedDataSourceSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/FileBasedDataSourceSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/GeneratorFunctionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/GeneratorFunctionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/GeneratorFunctionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/GeneratorFunctionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/IntegratedUDFTestUtils.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/IntegratedUDFTestUtils.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/IntegratedUDFTestUtils.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/IntegratedUDFTestUtils.scala diff --git a/core/src/test/scala/org/apache/spark/sql/JoinHintSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/JoinHintSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/JoinHintSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/JoinHintSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/JoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/JoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/JsonFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/JsonFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/JsonFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/JsonFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/LocalSparkSession.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/LocalSparkSession.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/LocalSparkSession.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/LocalSparkSession.scala diff --git a/core/src/test/scala/org/apache/spark/sql/MathFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/MathFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/MathFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/MathFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/MetadataCacheSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/MetadataCacheSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/MetadataCacheSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/MetadataCacheSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/MiscFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/MiscFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/MiscFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/MiscFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ProcessingTimeSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ProcessingTimeSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ProcessingTimeSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ProcessingTimeSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/QueryTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/QueryTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/QueryTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/QueryTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/RepartitionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/RepartitionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/RepartitionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/RepartitionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ReplaceNullWithFalseInPredicateEndToEndSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ReplaceNullWithFalseInPredicateEndToEndSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ReplaceNullWithFalseInPredicateEndToEndSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ReplaceNullWithFalseInPredicateEndToEndSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/RowSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/RowSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/RowSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/RowSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/RuntimeConfigSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/RuntimeConfigSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/RuntimeConfigSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/RuntimeConfigSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SQLContextSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SQLContextSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SQLContextSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SQLContextSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SQLQueryTestSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SQLQueryTestSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SQLQueryTestSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SQLQueryTestSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SSBQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SSBQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SSBQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SSBQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ScalaReflectionRelationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ScalaReflectionRelationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ScalaReflectionRelationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ScalaReflectionRelationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SerializationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SerializationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SerializationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SerializationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SessionStateSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SessionStateSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SessionStateSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SessionStateSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/ShowCreateTableSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/ShowCreateTableSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/ShowCreateTableSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/ShowCreateTableSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SparkSessionBuilderSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SparkSessionBuilderSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SparkSessionBuilderSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SparkSessionBuilderSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SparkSessionExtensionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SparkSessionExtensionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SparkSessionExtensionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SparkSessionExtensionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/StatisticsCollectionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/StatisticsCollectionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/StatisticsCollectionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/StatisticsCollectionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/StatisticsCollectionTestBase.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/StatisticsCollectionTestBase.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/StatisticsCollectionTestBase.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/StatisticsCollectionTestBase.scala diff --git a/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/StringFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/TPCDSQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/TPCDSQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/TPCDSQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/TPCDSQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/TPCDSSchema.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/TPCDSSchema.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/TPCDSSchema.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/TPCDSSchema.scala diff --git a/core/src/test/scala/org/apache/spark/sql/TPCHQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/TPCHQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/TPCHQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/TPCHQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/TestQueryExecutionListener.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/TestQueryExecutionListener.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/TestQueryExecutionListener.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/TestQueryExecutionListener.scala diff --git a/core/src/test/scala/org/apache/spark/sql/TypedImperativeAggregateSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/TypedImperativeAggregateSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/TypedImperativeAggregateSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/TypedImperativeAggregateSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/UDFSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/UDFSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/UDFSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/UDFSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/UDTRegistrationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/UDTRegistrationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/UDTRegistrationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/UDTRegistrationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/UnsafeRowSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/UserDefinedTypeSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/XPathFunctionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/XPathFunctionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/XPathFunctionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/XPathFunctionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/AlterTableTests.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSessionCatalogSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSessionCatalogSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSessionCatalogSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSessionCatalogSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2DataFrameSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSessionCatalogSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSessionCatalogSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSessionCatalogSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSessionCatalogSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2SQLSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2Suite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2Suite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2Suite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2Suite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2UtilsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2UtilsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2UtilsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/DataSourceV2UtilsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/FileDataSourceV2FallBackSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/FileDataSourceV2FallBackSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/FileDataSourceV2FallBackSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/FileDataSourceV2FallBackSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/InsertIntoTests.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/InsertIntoTests.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/InsertIntoTests.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/InsertIntoTests.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/SimpleWritableDataSource.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/SimpleWritableDataSource.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/SimpleWritableDataSource.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/SimpleWritableDataSource.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/SupportsCatalogOptionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/SupportsCatalogOptionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/SupportsCatalogOptionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/SupportsCatalogOptionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/TableCapabilityCheckSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/TableCapabilityCheckSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/TableCapabilityCheckSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/TableCapabilityCheckSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/TestV2SessionCatalogBase.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/TestV2SessionCatalogBase.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/TestV2SessionCatalogBase.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/TestV2SessionCatalogBase.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/V1ReadFallbackSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/V1ReadFallbackSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/V1ReadFallbackSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/V1ReadFallbackSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/V1WriteFallbackSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/V1WriteFallbackSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/V1WriteFallbackSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/V1WriteFallbackSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/connector/V2CommandsCaseSensitivitySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/V2CommandsCaseSensitivitySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/connector/V2CommandsCaseSensitivitySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/connector/V2CommandsCaseSensitivitySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/AggregatingAccumulatorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/AggregatingAccumulatorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/AggregatingAccumulatorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/AggregatingAccumulatorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/BroadcastExchangeSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/BroadcastExchangeSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/BroadcastExchangeSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/BroadcastExchangeSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/CoGroupedIteratorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/CoGroupedIteratorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/CoGroupedIteratorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/CoGroupedIteratorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/CoalesceShufflePartitionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/CoalesceShufflePartitionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/CoalesceShufflePartitionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/CoalesceShufflePartitionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/DataSourceScanExecRedactionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/DataSourceScanExecRedactionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/DataSourceScanExecRedactionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/DataSourceScanExecRedactionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/DeprecatedWholeStageCodegenSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/DeprecatedWholeStageCodegenSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/DeprecatedWholeStageCodegenSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/DeprecatedWholeStageCodegenSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/ExchangeSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ExchangeSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/ExchangeSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ExchangeSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/ExternalAppendOnlyUnsafeRowArraySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ExternalAppendOnlyUnsafeRowArraySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/ExternalAppendOnlyUnsafeRowArraySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ExternalAppendOnlyUnsafeRowArraySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/GlobalTempViewSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/GlobalTempViewSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/GlobalTempViewSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/GlobalTempViewSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/GroupedIteratorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/GroupedIteratorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/GroupedIteratorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/GroupedIteratorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/HiveResultSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/HiveResultSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/HiveResultSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/HiveResultSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/LogicalPlanTagInSparkPlanSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/LogicalPlanTagInSparkPlanSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/LogicalPlanTagInSparkPlanSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/LogicalPlanTagInSparkPlanSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/OptimizeMetadataOnlyQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/PlannerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/PlannerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/PlannerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/PlannerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/QueryExecutionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/QueryExecutionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/QueryExecutionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/QueryExecutionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/QueryPlanningTrackerEndToEndSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/QueryPlanningTrackerEndToEndSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/QueryPlanningTrackerEndToEndSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/QueryPlanningTrackerEndToEndSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/ReferenceSort.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ReferenceSort.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/ReferenceSort.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ReferenceSort.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SQLExecutionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SQLExecutionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SQLExecutionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SQLExecutionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SQLJsonProtocolSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SQLJsonProtocolSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SQLJsonProtocolSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SQLJsonProtocolSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SQLViewSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SQLViewSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SQLViewSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SQLViewSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SQLWindowFunctionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SQLWindowFunctionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SQLWindowFunctionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SQLWindowFunctionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SameResultSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SameResultSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SameResultSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SameResultSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/ShufflePartitionsUtilSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ShufflePartitionsUtilSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/ShufflePartitionsUtilSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ShufflePartitionsUtilSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SortSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SortSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SortSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SortSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SparkPlanSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SparkPlanSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SparkPlanSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SparkPlanSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SparkPlanTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SparkPlanTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SparkPlanTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SparkPlanTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SparkPlannerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SparkPlannerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SparkPlannerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SparkPlannerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/SparkSqlParserSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/TakeOrderedAndProjectSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/TakeOrderedAndProjectSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/TakeOrderedAndProjectSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/TakeOrderedAndProjectSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/UnsafeFixedWidthAggregationMapSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/UnsafeKVExternalSorterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/UnsafeKVExternalSorterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/UnsafeKVExternalSorterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/UnsafeKVExternalSorterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/UnsafeRowSerializerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/UnsafeRowSerializerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/UnsafeRowSerializerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/UnsafeRowSerializerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSparkSubmitSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSparkSubmitSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSparkSubmitSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSparkSubmitSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/WholeStageCodegenSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveQueryExecSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveQueryExecSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveQueryExecSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveQueryExecSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveTestUtils.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveTestUtils.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveTestUtils.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/adaptive/AdaptiveTestUtils.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/adaptive/ColumnarAdaptiveQueryExecSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/adaptive/ColumnarAdaptiveQueryExecSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/adaptive/ColumnarAdaptiveQueryExecSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/adaptive/ColumnarAdaptiveQueryExecSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/aggregate/SortBasedAggregationStoreSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/aggregate/SortBasedAggregationStoreSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/aggregate/SortBasedAggregationStoreSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/aggregate/SortBasedAggregationStoreSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowConvertersSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowConvertersSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowConvertersSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowConvertersSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowWriterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowWriterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowWriterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowWriterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnStatsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnStatsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnStatsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnStatsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnTypeSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnTypeSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnTypeSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnTypeSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnarTestUtils.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnarTestUtils.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnarTestUtils.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/ColumnarTestUtils.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/InMemoryColumnarQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/InMemoryColumnarQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/InMemoryColumnarQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/InMemoryColumnarQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnAccessorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnAccessorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnAccessorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnAccessorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnBuilderSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnBuilderSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnBuilderSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/NullableColumnBuilderSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/PartitionBatchPruningSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/PartitionBatchPruningSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/PartitionBatchPruningSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/PartitionBatchPruningSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/BooleanBitSetSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/BooleanBitSetSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/BooleanBitSetSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/BooleanBitSetSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/DictionaryEncodingSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/DictionaryEncodingSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/DictionaryEncodingSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/DictionaryEncodingSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/IntegralDeltaSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/IntegralDeltaSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/IntegralDeltaSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/IntegralDeltaSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/PassThroughEncodingSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/PassThroughEncodingSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/PassThroughEncodingSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/PassThroughEncodingSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/RunLengthEncodingSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/RunLengthEncodingSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/RunLengthEncodingSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/RunLengthEncodingSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/TestCompressibleColumnBuilder.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/TestCompressibleColumnBuilder.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/TestCompressibleColumnBuilder.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/columnar/compression/TestCompressibleColumnBuilder.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/command/CommandUtilsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/command/CommandUtilsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/command/CommandUtilsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/command/CommandUtilsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/command/DDLParserSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/command/DDLParserSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/command/DDLParserSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/command/DDLParserSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/command/DDLSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/command/DDLSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/command/DDLSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/command/DDLSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/command/PlanResolutionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/command/PlanResolutionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/command/PlanResolutionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/command/PlanResolutionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/BasicWriteTaskStatsTrackerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/BasicWriteTaskStatsTrackerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/BasicWriteTaskStatsTrackerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/BasicWriteTaskStatsTrackerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/BucketingUtilsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/BucketingUtilsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/BucketingUtilsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/BucketingUtilsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/DataSourceStrategySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/DataSourceStrategySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/DataSourceStrategySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/DataSourceStrategySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileBasedDataSourceTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileBasedDataSourceTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/FileBasedDataSourceTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileBasedDataSourceTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileFormatWriterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileFormatWriterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/FileFormatWriterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileFormatWriterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileIndexSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileIndexSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/FileIndexSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileIndexSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileSourceStrategySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileSourceStrategySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/FileSourceStrategySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileSourceStrategySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/HadoopFileLinesReaderSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/HadoopFileLinesReaderSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/HadoopFileLinesReaderSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/HadoopFileLinesReaderSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadNestedSchemaTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadNestedSchemaTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadNestedSchemaTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadNestedSchemaTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/ReadSchemaTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/RowDataSourceStrategySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/RowDataSourceStrategySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/RowDataSourceStrategySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/RowDataSourceStrategySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/SaveIntoDataSourceCommandSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/SaveIntoDataSourceCommandSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/SaveIntoDataSourceCommandSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/SaveIntoDataSourceCommandSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/SchemaPruningSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/SchemaPruningSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/SchemaPruningSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/SchemaPruningSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/binaryfile/BinaryFileFormatSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/binaryfile/BinaryFileFormatSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/binaryfile/BinaryFileFormatSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/binaryfile/BinaryFileFormatSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/csv/CSVSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/csv/CSVSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/csv/CSVSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/csv/CSVSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/csv/TestCsvData.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/csv/TestCsvData.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/csv/TestCsvData.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/csv/TestCsvData.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/jdbc/JdbcUtilsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/jdbc/JdbcUtilsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/jdbc/JdbcUtilsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/jdbc/JdbcUtilsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonParsingOptionsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonParsingOptionsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonParsingOptionsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonParsingOptionsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/JsonSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/TestJsonData.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/TestJsonData.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/json/TestJsonData.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/json/TestJsonData.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopStreamSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopStreamSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopStreamSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopStreamSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/noop/NoopSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcColumnarBatchReaderSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcColumnarBatchReaderSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcColumnarBatchReaderSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcColumnarBatchReaderSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcPartitionDiscoverySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcPartitionDiscoverySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcPartitionDiscoverySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcPartitionDiscoverySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcSourceSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcSourceSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcSourceSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcSourceSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1FilterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1FilterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1FilterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1FilterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1SchemaPruningSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1SchemaPruningSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1SchemaPruningSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV1SchemaPruningSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV2SchemaPruningSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV2SchemaPruningSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV2SchemaPruningSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/orc/OrcV2SchemaPruningSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetAvroCompatibilitySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetAvroCompatibilitySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetAvroCompatibilitySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetAvroCompatibilitySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCommitterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCommitterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCommitterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCommitterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompatibilityTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompatibilityTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompatibilityTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompatibilityTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompressionCodecPrecedenceSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompressionCodecPrecedenceSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompressionCodecPrecedenceSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetCompressionCodecPrecedenceSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetEncodingSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetEncodingSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetEncodingSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetEncodingSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFileFormatSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetFilterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetIOSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetIOSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetIOSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetIOSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetInteroperabilitySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetInteroperabilitySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetInteroperabilitySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetInteroperabilitySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetPartitionDiscoverySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetPartitionDiscoverySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetPartitionDiscoverySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetPartitionDiscoverySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetProtobufCompatibilitySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetProtobufCompatibilitySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetProtobufCompatibilitySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetProtobufCompatibilitySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaPruningSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaPruningSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaPruningSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaPruningSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetSchemaSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetThriftCompatibilitySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetThriftCompatibilitySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetThriftCompatibilitySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetThriftCompatibilitySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/text/TextSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/text/TextSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/text/TextSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/text/TextSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/text/WholeTextFileSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/text/WholeTextFileSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/text/WholeTextFileSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/text/WholeTextFileSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/v2/FileTableSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/v2/FileTableSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/v2/FileTableSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/v2/FileTableSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/datasources/v2/V2SessionCatalogSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/v2/V2SessionCatalogSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/datasources/v2/V2SessionCatalogSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/datasources/v2/V2SessionCatalogSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/debug/DebuggingSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/debug/DebuggingSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/debug/DebuggingSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/debug/DebuggingSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/history/SQLEventFilterBuilderSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/history/SQLEventFilterBuilderSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/history/SQLEventFilterBuilderSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/history/SQLEventFilterBuilderSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/history/SQLLiveEntitiesEventFilterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/history/SQLLiveEntitiesEventFilterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/history/SQLLiveEntitiesEventFilterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/history/SQLLiveEntitiesEventFilterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/joins/BroadcastJoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/BroadcastJoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/joins/BroadcastJoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/BroadcastJoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/joins/ExistenceJoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/ExistenceJoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/joins/ExistenceJoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/ExistenceJoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/joins/HashedRelationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/HashedRelationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/joins/HashedRelationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/HashedRelationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/joins/InnerJoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/InnerJoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/joins/InnerJoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/InnerJoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/joins/OuterJoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/OuterJoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/joins/OuterJoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/joins/OuterJoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsTestUtils.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsTestUtils.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsTestUtils.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/metric/SQLMetricsTestUtils.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/python/BatchEvalPythonExecSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/BatchEvalPythonExecSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/python/BatchEvalPythonExecSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/BatchEvalPythonExecSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/python/ExtractPythonUDFsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/ExtractPythonUDFsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/python/ExtractPythonUDFsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/ExtractPythonUDFsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/python/PythonForeachWriterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/PythonForeachWriterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/python/PythonForeachWriterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/PythonForeachWriterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/python/PythonUDFSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/PythonUDFSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/python/PythonUDFSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/PythonUDFSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/python/RowQueueSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/RowQueueSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/python/RowQueueSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/python/RowQueueSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/CheckpointFileManagerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/CheckpointFileManagerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/CheckpointFileManagerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/CheckpointFileManagerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/CompactibleFileStreamLogSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/CompactibleFileStreamLogSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/CompactibleFileStreamLogSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/CompactibleFileStreamLogSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/FileStreamSinkLogSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/FileStreamSinkLogSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/FileStreamSinkLogSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/FileStreamSinkLogSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/HDFSMetadataLogSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/HDFSMetadataLogSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/HDFSMetadataLogSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/HDFSMetadataLogSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/MemorySinkSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/MemorySinkSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/MemorySinkSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/MemorySinkSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/MicroBatchExecutionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/MicroBatchExecutionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/MicroBatchExecutionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/MicroBatchExecutionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/OffsetSeqLogSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/OffsetSeqLogSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/OffsetSeqLogSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/OffsetSeqLogSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/ProcessingTimeExecutorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/ProcessingTimeExecutorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/ProcessingTimeExecutorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/ProcessingTimeExecutorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/StreamMetadataSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/StreamMetadataSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/StreamMetadataSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/StreamMetadataSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/continuous/shuffle/ContinuousShuffleSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/continuous/shuffle/ContinuousShuffleSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/continuous/shuffle/ContinuousShuffleSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/continuous/shuffle/ContinuousShuffleSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ConsoleWriteSupportSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ConsoleWriteSupportSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ConsoleWriteSupportSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ConsoleWriteSupportSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachBatchSinkSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachBatchSinkSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachBatchSinkSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachBatchSinkSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachWriterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachWriterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachWriterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/ForeachWriterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/RateStreamProviderSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/RateStreamProviderSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/RateStreamProviderSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/RateStreamProviderSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/TextSocketStreamSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/TextSocketStreamSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/TextSocketStreamSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/sources/TextSocketStreamSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/FlatMapGroupsWithStateExecHelperSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/FlatMapGroupsWithStateExecHelperSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/state/FlatMapGroupsWithStateExecHelperSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/FlatMapGroupsWithStateExecHelperSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/MemoryStateStore.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/MemoryStateStore.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/state/MemoryStateStore.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/MemoryStateStore.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreCoordinatorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreCoordinatorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreCoordinatorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreCoordinatorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreRDDSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreRDDSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreRDDSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreRDDSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StateStoreSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StreamingAggregationStateManagerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StreamingAggregationStateManagerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StreamingAggregationStateManagerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/StreamingAggregationStateManagerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/SymmetricHashJoinStateManagerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/SymmetricHashJoinStateManagerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/streaming/state/SymmetricHashJoinStateManagerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/streaming/state/SymmetricHashJoinStateManagerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/ui/AllExecutionsPageSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ui/AllExecutionsPageSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/ui/AllExecutionsPageSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ui/AllExecutionsPageSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/ui/SQLAppStatusListenerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ui/SQLAppStatusListenerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/ui/SQLAppStatusListenerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/ui/SQLAppStatusListenerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ArrowColumnVectorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ArrowColumnVectorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/vectorized/ArrowColumnVectorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ArrowColumnVectorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnVectorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnVectorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnVectorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnVectorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnarBatchSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnarBatchSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnarBatchSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/execution/vectorized/ColumnarBatchSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/expressions/ExpressionInfoSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/expressions/ExpressionInfoSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/expressions/ExpressionInfoSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/expressions/ExpressionInfoSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/expressions/ReduceAggregatorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/expressions/ReduceAggregatorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/expressions/ReduceAggregatorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/expressions/ReduceAggregatorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/CatalogSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/internal/DeprecatedCreateExternalTableSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/DeprecatedCreateExternalTableSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/internal/DeprecatedCreateExternalTableSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/DeprecatedCreateExternalTableSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/internal/ExecutorSideSQLConfSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/ExecutorSideSQLConfSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/internal/ExecutorSideSQLConfSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/ExecutorSideSQLConfSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/internal/SQLConfEntrySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/SQLConfEntrySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/internal/SQLConfEntrySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/SQLConfEntrySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/internal/SQLConfGetterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/SQLConfGetterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/internal/SQLConfGetterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/SQLConfGetterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/internal/SQLConfSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/SQLConfSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/internal/SQLConfSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/SQLConfSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/internal/SharedStateSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/SharedStateSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/internal/SharedStateSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/SharedStateSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/internal/VariableSubstitutionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/VariableSubstitutionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/internal/VariableSubstitutionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/internal/VariableSubstitutionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCWriteSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCWriteSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/jdbc/JDBCWriteSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCWriteSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/BucketedReadSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/BucketedReadSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/BucketedReadSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/BucketedReadSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/BucketedWriteSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/BucketedWriteSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/BucketedWriteSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/BucketedWriteSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/CreateTableAsSelectSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/CreateTableAsSelectSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/CreateTableAsSelectSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/CreateTableAsSelectSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/DDLSourceLoadSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/DDLSourceLoadSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/DDLSourceLoadSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/DDLSourceLoadSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/DataSourceAnalysisSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/DataSourceAnalysisSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/DataSourceAnalysisSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/DataSourceAnalysisSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/DataSourceTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/DataSourceTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/DataSourceTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/DataSourceTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/ExternalCommandRunnerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/ExternalCommandRunnerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/ExternalCommandRunnerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/ExternalCommandRunnerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/FilteredScanSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/FilteredScanSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/FilteredScanSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/FilteredScanSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/FiltersSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/FiltersSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/FiltersSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/FiltersSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/InsertSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/InsertSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/InsertSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/InsertSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/PartitionedWriteSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/PartitionedWriteSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/PartitionedWriteSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/PartitionedWriteSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/PathOptionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/PathOptionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/PathOptionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/PathOptionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/PrunedScanSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/PrunedScanSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/PrunedScanSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/PrunedScanSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/ResolvedDataSourceSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/ResolvedDataSourceSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/ResolvedDataSourceSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/ResolvedDataSourceSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/SaveLoadSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/SaveLoadSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/SaveLoadSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/SaveLoadSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/TableScanSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/TableScanSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/TableScanSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/TableScanSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/sources/fakeExternalSources.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/fakeExternalSources.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/sources/fakeExternalSources.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/sources/fakeExternalSources.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/DeprecatedStreamingAggregationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/DeprecatedStreamingAggregationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/DeprecatedStreamingAggregationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/DeprecatedStreamingAggregationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/EventTimeWatermarkSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/EventTimeWatermarkSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/EventTimeWatermarkSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/EventTimeWatermarkSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamSinkSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamSinkSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/FileStreamSinkSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamSinkSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamSourceSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamSourceSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/FileStreamSourceSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamSourceSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamStressSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamStressSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/FileStreamStressSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/FileStreamStressSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/FlatMapGroupsWithStateSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/FlatMapGroupsWithStateSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/FlatMapGroupsWithStateSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/FlatMapGroupsWithStateSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/MemorySourceStressSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/MemorySourceStressSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/MemorySourceStressSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/MemorySourceStressSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/OffsetSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/OffsetSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/OffsetSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/OffsetSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StateStoreMetricsTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StateStoreMetricsTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StateStoreMetricsTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StateStoreMetricsTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamTest.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamTest.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamTest.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamTest.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingAggregationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingAggregationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingAggregationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingAggregationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingDeduplicationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingDeduplicationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingDeduplicationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingDeduplicationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingJoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingJoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingJoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingJoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenersConfSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenersConfSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenersConfSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryListenersConfSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryManagerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryManagerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryManagerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryManagerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryStatusAndProgressSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryStatusAndProgressSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryStatusAndProgressSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQueryStatusAndProgressSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQuerySuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQuerySuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingQuerySuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingQuerySuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/StreamingSymmetricHashJoinHelperSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingSymmetricHashJoinHelperSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/StreamingSymmetricHashJoinHelperSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/StreamingSymmetricHashJoinHelperSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousAggregationSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousAggregationSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousAggregationSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousAggregationSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueryStatusAndProgressSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueryStatusAndProgressSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueryStatusAndProgressSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueryStatusAndProgressSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueuedDataReaderSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueuedDataReaderSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueuedDataReaderSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousQueuedDataReaderSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/ContinuousSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/continuous/EpochCoordinatorSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/EpochCoordinatorSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/continuous/EpochCoordinatorSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/continuous/EpochCoordinatorSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/sources/StreamingDataSourceV2Suite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/sources/StreamingDataSourceV2Suite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/sources/StreamingDataSourceV2Suite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/sources/StreamingDataSourceV2Suite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/test/DataStreamReaderWriterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/test/DataStreamReaderWriterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/test/DataStreamReaderWriterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/test/DataStreamReaderWriterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryPageSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryPageSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryPageSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryPageSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryStatusListenerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryStatusListenerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryStatusListenerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/ui/StreamingQueryStatusListenerSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/ui/UISeleniumSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/ui/UISeleniumSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/ui/UISeleniumSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/ui/UISeleniumSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/ui/UIUtilsSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/ui/UIUtilsSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/ui/UIUtilsSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/ui/UIUtilsSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/util/BlockOnStopSource.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/util/BlockOnStopSource.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/util/BlockOnStopSource.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/util/BlockOnStopSource.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/util/BlockingSource.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/util/BlockingSource.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/util/BlockingSource.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/util/BlockingSource.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/util/MockSourceProvider.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/util/MockSourceProvider.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/util/MockSourceProvider.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/util/MockSourceProvider.scala diff --git a/core/src/test/scala/org/apache/spark/sql/streaming/util/StreamManualClock.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/util/StreamManualClock.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/streaming/util/StreamManualClock.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/streaming/util/StreamManualClock.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/DataFrameReaderWriterSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/GenericFlatSpecSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/GenericFlatSpecSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/GenericFlatSpecSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/GenericFlatSpecSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/GenericFunSpecSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/GenericFunSpecSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/GenericFunSpecSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/GenericFunSpecSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/GenericWordSpecSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/GenericWordSpecSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/GenericWordSpecSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/GenericWordSpecSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/ProcessTestUtils.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/ProcessTestUtils.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/ProcessTestUtils.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/ProcessTestUtils.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/SQLTestData.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/SQLTestData.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/SQLTestData.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/SQLTestData.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/SQLTestUtils.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/SharedSparkSession.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/TestSQLContext.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/TestSQLContext.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/TestSQLContext.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/TestSQLContext.scala diff --git a/core/src/test/scala/org/apache/spark/sql/test/TestSparkSessionSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/TestSparkSessionSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/test/TestSparkSessionSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/test/TestSparkSessionSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameAggregateSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameAggregateSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameAggregateSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameAggregateSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameJoinSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameJoinSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameJoinSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/travis/TravisDataFrameJoinSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/util/DataFrameCallbackSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/util/DataFrameCallbackSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/util/DataFrameCallbackSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/util/DataFrameCallbackSuite.scala diff --git a/core/src/test/scala/org/apache/spark/sql/util/ExecutionListenerManagerSuite.scala b/native-sql-engine/core/src/test/scala/org/apache/spark/sql/util/ExecutionListenerManagerSuite.scala similarity index 100% rename from core/src/test/scala/org/apache/spark/sql/util/ExecutionListenerManagerSuite.scala rename to native-sql-engine/core/src/test/scala/org/apache/spark/sql/util/ExecutionListenerManagerSuite.scala diff --git a/cpp/CMakeLists.txt b/native-sql-engine/cpp/CMakeLists.txt similarity index 100% rename from cpp/CMakeLists.txt rename to native-sql-engine/cpp/CMakeLists.txt diff --git a/cpp/compile.sh b/native-sql-engine/cpp/compile.sh similarity index 100% rename from cpp/compile.sh rename to native-sql-engine/cpp/compile.sh diff --git a/cpp/src/CMakeLists.txt b/native-sql-engine/cpp/src/CMakeLists.txt similarity index 100% rename from cpp/src/CMakeLists.txt rename to native-sql-engine/cpp/src/CMakeLists.txt diff --git a/cpp/src/benchmarks/CMakeLists.txt b/native-sql-engine/cpp/src/benchmarks/CMakeLists.txt similarity index 100% rename from cpp/src/benchmarks/CMakeLists.txt rename to native-sql-engine/cpp/src/benchmarks/CMakeLists.txt diff --git a/cpp/src/benchmarks/arrow_compute_benchmark_hash_aggregate.cc b/native-sql-engine/cpp/src/benchmarks/arrow_compute_benchmark_hash_aggregate.cc similarity index 100% rename from cpp/src/benchmarks/arrow_compute_benchmark_hash_aggregate.cc rename to native-sql-engine/cpp/src/benchmarks/arrow_compute_benchmark_hash_aggregate.cc diff --git a/cpp/src/benchmarks/arrow_compute_benchmark_join.cc b/native-sql-engine/cpp/src/benchmarks/arrow_compute_benchmark_join.cc similarity index 100% rename from cpp/src/benchmarks/arrow_compute_benchmark_join.cc rename to native-sql-engine/cpp/src/benchmarks/arrow_compute_benchmark_join.cc diff --git a/cpp/src/benchmarks/arrow_compute_benchmark_sort.cc b/native-sql-engine/cpp/src/benchmarks/arrow_compute_benchmark_sort.cc similarity index 100% rename from cpp/src/benchmarks/arrow_compute_benchmark_sort.cc rename to native-sql-engine/cpp/src/benchmarks/arrow_compute_benchmark_sort.cc diff --git a/cpp/src/benchmarks/arrow_compute_benchmark_wscg.cc b/native-sql-engine/cpp/src/benchmarks/arrow_compute_benchmark_wscg.cc similarity index 100% rename from cpp/src/benchmarks/arrow_compute_benchmark_wscg.cc rename to native-sql-engine/cpp/src/benchmarks/arrow_compute_benchmark_wscg.cc diff --git a/cpp/src/benchmarks/shuffle_split_benchmark.cc b/native-sql-engine/cpp/src/benchmarks/shuffle_split_benchmark.cc similarity index 100% rename from cpp/src/benchmarks/shuffle_split_benchmark.cc rename to native-sql-engine/cpp/src/benchmarks/shuffle_split_benchmark.cc diff --git a/cpp/src/codegen/arrow_compute/code_generator.h b/native-sql-engine/cpp/src/codegen/arrow_compute/code_generator.h similarity index 100% rename from cpp/src/codegen/arrow_compute/code_generator.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/code_generator.h diff --git a/cpp/src/codegen/arrow_compute/expr_visitor.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/expr_visitor.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/expr_visitor.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/expr_visitor.cc diff --git a/cpp/src/codegen/arrow_compute/expr_visitor.h b/native-sql-engine/cpp/src/codegen/arrow_compute/expr_visitor.h similarity index 100% rename from cpp/src/codegen/arrow_compute/expr_visitor.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/expr_visitor.h diff --git a/cpp/src/codegen/arrow_compute/expr_visitor_impl.h b/native-sql-engine/cpp/src/codegen/arrow_compute/expr_visitor_impl.h similarity index 100% rename from cpp/src/codegen/arrow_compute/expr_visitor_impl.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/expr_visitor_impl.h diff --git a/cpp/src/codegen/arrow_compute/ext/action_codegen.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/action_codegen.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/action_codegen.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/action_codegen.h diff --git a/cpp/src/codegen/arrow_compute/ext/actions_impl.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/actions_impl.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/actions_impl.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/actions_impl.cc diff --git a/cpp/src/codegen/arrow_compute/ext/actions_impl.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/actions_impl.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/actions_impl.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/actions_impl.h diff --git a/cpp/src/codegen/arrow_compute/ext/array_appender.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/array_appender.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/array_appender.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/array_appender.h diff --git a/cpp/src/codegen/arrow_compute/ext/array_item_index.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/array_item_index.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/array_item_index.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/array_item_index.h diff --git a/cpp/src/codegen/arrow_compute/ext/basic_physical_kernels.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/basic_physical_kernels.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/basic_physical_kernels.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/basic_physical_kernels.cc diff --git a/cpp/src/codegen/arrow_compute/ext/cmp_function.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/cmp_function.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/cmp_function.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/cmp_function.h diff --git a/cpp/src/codegen/arrow_compute/ext/code_generator_base.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/code_generator_base.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/code_generator_base.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/code_generator_base.h diff --git a/cpp/src/codegen/arrow_compute/ext/codegen_common.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_common.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/codegen_common.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_common.cc diff --git a/cpp/src/codegen/arrow_compute/ext/codegen_common.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_common.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/codegen_common.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_common.h diff --git a/cpp/src/codegen/arrow_compute/ext/codegen_context.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_context.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/codegen_context.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_context.h diff --git a/cpp/src/codegen/arrow_compute/ext/codegen_node_visitor.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_node_visitor.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/codegen_node_visitor.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_node_visitor.cc diff --git a/cpp/src/codegen/arrow_compute/ext/codegen_node_visitor.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_node_visitor.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/codegen_node_visitor.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_node_visitor.h diff --git a/cpp/src/codegen/arrow_compute/ext/codegen_register.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_register.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/codegen_register.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_register.cc diff --git a/cpp/src/codegen/arrow_compute/ext/codegen_register.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_register.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/codegen_register.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/codegen_register.h diff --git a/cpp/src/codegen/arrow_compute/ext/conditioned_merge_join_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/conditioned_merge_join_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/conditioned_merge_join_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/conditioned_merge_join_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/conditioned_probe_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/conditioned_probe_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/conditioned_probe_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/conditioned_probe_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.cc diff --git a/cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/expression_codegen_visitor.h diff --git a/cpp/src/codegen/arrow_compute/ext/hash_aggregate_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/hash_aggregate_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/hash_aggregate_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/hash_aggregate_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/hash_relation_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/hash_relation_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/hash_relation_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/hash_relation_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/kernels_ext.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/kernels_ext.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/kernels_ext.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/kernels_ext.cc diff --git a/cpp/src/codegen/arrow_compute/ext/kernels_ext.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/kernels_ext.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/kernels_ext.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/kernels_ext.h diff --git a/cpp/src/codegen/arrow_compute/ext/merge_join_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/merge_join_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/merge_join_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/merge_join_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/probe_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/probe_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/probe_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/probe_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/sort_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/sort_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/sort_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/sort_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/typed_action_codegen_impl.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/typed_action_codegen_impl.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/typed_action_codegen_impl.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/typed_action_codegen_impl.h diff --git a/cpp/src/codegen/arrow_compute/ext/typed_node_visitor.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/typed_node_visitor.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/typed_node_visitor.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/typed_node_visitor.cc diff --git a/cpp/src/codegen/arrow_compute/ext/typed_node_visitor.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/typed_node_visitor.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/typed_node_visitor.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/typed_node_visitor.h diff --git a/cpp/src/codegen/arrow_compute/ext/whole_stage_codegen_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/whole_stage_codegen_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/whole_stage_codegen_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/whole_stage_codegen_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/window_kernel.cc b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/window_kernel.cc similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/window_kernel.cc rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/window_kernel.cc diff --git a/cpp/src/codegen/arrow_compute/ext/window_sort_kernel.h b/native-sql-engine/cpp/src/codegen/arrow_compute/ext/window_sort_kernel.h similarity index 100% rename from cpp/src/codegen/arrow_compute/ext/window_sort_kernel.h rename to native-sql-engine/cpp/src/codegen/arrow_compute/ext/window_sort_kernel.h diff --git a/cpp/src/codegen/code_generator.h b/native-sql-engine/cpp/src/codegen/code_generator.h similarity index 100% rename from cpp/src/codegen/code_generator.h rename to native-sql-engine/cpp/src/codegen/code_generator.h diff --git a/cpp/src/codegen/code_generator_factory.h b/native-sql-engine/cpp/src/codegen/code_generator_factory.h similarity index 100% rename from cpp/src/codegen/code_generator_factory.h rename to native-sql-engine/cpp/src/codegen/code_generator_factory.h diff --git a/cpp/src/codegen/common/hash_relation.h b/native-sql-engine/cpp/src/codegen/common/hash_relation.h similarity index 100% rename from cpp/src/codegen/common/hash_relation.h rename to native-sql-engine/cpp/src/codegen/common/hash_relation.h diff --git a/cpp/src/codegen/common/hash_relation_number.h b/native-sql-engine/cpp/src/codegen/common/hash_relation_number.h similarity index 100% rename from cpp/src/codegen/common/hash_relation_number.h rename to native-sql-engine/cpp/src/codegen/common/hash_relation_number.h diff --git a/cpp/src/codegen/common/hash_relation_string.h b/native-sql-engine/cpp/src/codegen/common/hash_relation_string.h similarity index 100% rename from cpp/src/codegen/common/hash_relation_string.h rename to native-sql-engine/cpp/src/codegen/common/hash_relation_string.h diff --git a/cpp/src/codegen/common/relation.cc b/native-sql-engine/cpp/src/codegen/common/relation.cc similarity index 100% rename from cpp/src/codegen/common/relation.cc rename to native-sql-engine/cpp/src/codegen/common/relation.cc diff --git a/cpp/src/codegen/common/relation_column.h b/native-sql-engine/cpp/src/codegen/common/relation_column.h similarity index 100% rename from cpp/src/codegen/common/relation_column.h rename to native-sql-engine/cpp/src/codegen/common/relation_column.h diff --git a/cpp/src/codegen/common/result_iterator.h b/native-sql-engine/cpp/src/codegen/common/result_iterator.h similarity index 100% rename from cpp/src/codegen/common/result_iterator.h rename to native-sql-engine/cpp/src/codegen/common/result_iterator.h diff --git a/cpp/src/codegen/common/sort_relation.h b/native-sql-engine/cpp/src/codegen/common/sort_relation.h similarity index 100% rename from cpp/src/codegen/common/sort_relation.h rename to native-sql-engine/cpp/src/codegen/common/sort_relation.h diff --git a/cpp/src/codegen/common/visitor_base.h b/native-sql-engine/cpp/src/codegen/common/visitor_base.h similarity index 100% rename from cpp/src/codegen/common/visitor_base.h rename to native-sql-engine/cpp/src/codegen/common/visitor_base.h diff --git a/cpp/src/codegen/compute_ext/code_generator.h b/native-sql-engine/cpp/src/codegen/compute_ext/code_generator.h similarity index 100% rename from cpp/src/codegen/compute_ext/code_generator.h rename to native-sql-engine/cpp/src/codegen/compute_ext/code_generator.h diff --git a/cpp/src/codegen/expr_visitor.cc b/native-sql-engine/cpp/src/codegen/expr_visitor.cc similarity index 100% rename from cpp/src/codegen/expr_visitor.cc rename to native-sql-engine/cpp/src/codegen/expr_visitor.cc diff --git a/cpp/src/codegen/expr_visitor.h b/native-sql-engine/cpp/src/codegen/expr_visitor.h similarity index 100% rename from cpp/src/codegen/expr_visitor.h rename to native-sql-engine/cpp/src/codegen/expr_visitor.h diff --git a/cpp/src/codegen/gandiva/code_generator.h b/native-sql-engine/cpp/src/codegen/gandiva/code_generator.h similarity index 100% rename from cpp/src/codegen/gandiva/code_generator.h rename to native-sql-engine/cpp/src/codegen/gandiva/code_generator.h diff --git a/cpp/src/jni/concurrent_map.h b/native-sql-engine/cpp/src/jni/concurrent_map.h similarity index 100% rename from cpp/src/jni/concurrent_map.h rename to native-sql-engine/cpp/src/jni/concurrent_map.h diff --git a/cpp/src/jni/jni_common.h b/native-sql-engine/cpp/src/jni/jni_common.h similarity index 100% rename from cpp/src/jni/jni_common.h rename to native-sql-engine/cpp/src/jni/jni_common.h diff --git a/cpp/src/jni/jni_wrapper.cc b/native-sql-engine/cpp/src/jni/jni_wrapper.cc similarity index 100% rename from cpp/src/jni/jni_wrapper.cc rename to native-sql-engine/cpp/src/jni/jni_wrapper.cc diff --git a/cpp/src/precompile/array.cc b/native-sql-engine/cpp/src/precompile/array.cc similarity index 100% rename from cpp/src/precompile/array.cc rename to native-sql-engine/cpp/src/precompile/array.cc diff --git a/cpp/src/precompile/array.h b/native-sql-engine/cpp/src/precompile/array.h similarity index 100% rename from cpp/src/precompile/array.h rename to native-sql-engine/cpp/src/precompile/array.h diff --git a/cpp/src/precompile/builder.cc b/native-sql-engine/cpp/src/precompile/builder.cc similarity index 100% rename from cpp/src/precompile/builder.cc rename to native-sql-engine/cpp/src/precompile/builder.cc diff --git a/cpp/src/precompile/builder.h b/native-sql-engine/cpp/src/precompile/builder.h similarity index 100% rename from cpp/src/precompile/builder.h rename to native-sql-engine/cpp/src/precompile/builder.h diff --git a/cpp/src/precompile/gandiva.h b/native-sql-engine/cpp/src/precompile/gandiva.h similarity index 100% rename from cpp/src/precompile/gandiva.h rename to native-sql-engine/cpp/src/precompile/gandiva.h diff --git a/cpp/src/precompile/gandiva_projector.cc b/native-sql-engine/cpp/src/precompile/gandiva_projector.cc similarity index 100% rename from cpp/src/precompile/gandiva_projector.cc rename to native-sql-engine/cpp/src/precompile/gandiva_projector.cc diff --git a/cpp/src/precompile/gandiva_projector.h b/native-sql-engine/cpp/src/precompile/gandiva_projector.h similarity index 100% rename from cpp/src/precompile/gandiva_projector.h rename to native-sql-engine/cpp/src/precompile/gandiva_projector.h diff --git a/cpp/src/precompile/hash_arrays_kernel.cc b/native-sql-engine/cpp/src/precompile/hash_arrays_kernel.cc similarity index 100% rename from cpp/src/precompile/hash_arrays_kernel.cc rename to native-sql-engine/cpp/src/precompile/hash_arrays_kernel.cc diff --git a/cpp/src/precompile/hash_arrays_kernel.h b/native-sql-engine/cpp/src/precompile/hash_arrays_kernel.h similarity index 100% rename from cpp/src/precompile/hash_arrays_kernel.h rename to native-sql-engine/cpp/src/precompile/hash_arrays_kernel.h diff --git a/cpp/src/precompile/hash_map.cc b/native-sql-engine/cpp/src/precompile/hash_map.cc similarity index 100% rename from cpp/src/precompile/hash_map.cc rename to native-sql-engine/cpp/src/precompile/hash_map.cc diff --git a/cpp/src/precompile/hash_map.h b/native-sql-engine/cpp/src/precompile/hash_map.h similarity index 100% rename from cpp/src/precompile/hash_map.h rename to native-sql-engine/cpp/src/precompile/hash_map.h diff --git a/cpp/src/precompile/sort.cc b/native-sql-engine/cpp/src/precompile/sort.cc similarity index 100% rename from cpp/src/precompile/sort.cc rename to native-sql-engine/cpp/src/precompile/sort.cc diff --git a/cpp/src/precompile/sort.h b/native-sql-engine/cpp/src/precompile/sort.h similarity index 100% rename from cpp/src/precompile/sort.h rename to native-sql-engine/cpp/src/precompile/sort.h diff --git a/cpp/src/precompile/sparse_hash_map.cc b/native-sql-engine/cpp/src/precompile/sparse_hash_map.cc similarity index 100% rename from cpp/src/precompile/sparse_hash_map.cc rename to native-sql-engine/cpp/src/precompile/sparse_hash_map.cc diff --git a/cpp/src/precompile/sparse_hash_map.h b/native-sql-engine/cpp/src/precompile/sparse_hash_map.h similarity index 100% rename from cpp/src/precompile/sparse_hash_map.h rename to native-sql-engine/cpp/src/precompile/sparse_hash_map.h diff --git a/cpp/src/precompile/type.cc b/native-sql-engine/cpp/src/precompile/type.cc similarity index 100% rename from cpp/src/precompile/type.cc rename to native-sql-engine/cpp/src/precompile/type.cc diff --git a/cpp/src/precompile/type.h b/native-sql-engine/cpp/src/precompile/type.h similarity index 100% rename from cpp/src/precompile/type.h rename to native-sql-engine/cpp/src/precompile/type.h diff --git a/cpp/src/precompile/type_traits.h b/native-sql-engine/cpp/src/precompile/type_traits.h similarity index 100% rename from cpp/src/precompile/type_traits.h rename to native-sql-engine/cpp/src/precompile/type_traits.h diff --git a/cpp/src/precompile/unsafe_array.cc b/native-sql-engine/cpp/src/precompile/unsafe_array.cc similarity index 100% rename from cpp/src/precompile/unsafe_array.cc rename to native-sql-engine/cpp/src/precompile/unsafe_array.cc diff --git a/cpp/src/precompile/unsafe_array.h b/native-sql-engine/cpp/src/precompile/unsafe_array.h similarity index 100% rename from cpp/src/precompile/unsafe_array.h rename to native-sql-engine/cpp/src/precompile/unsafe_array.h diff --git a/cpp/src/precompile/vector.cc b/native-sql-engine/cpp/src/precompile/vector.cc similarity index 100% rename from cpp/src/precompile/vector.cc rename to native-sql-engine/cpp/src/precompile/vector.cc diff --git a/cpp/src/precompile/vector.h b/native-sql-engine/cpp/src/precompile/vector.h similarity index 100% rename from cpp/src/precompile/vector.h rename to native-sql-engine/cpp/src/precompile/vector.h diff --git a/cpp/src/proto/Exprs.proto b/native-sql-engine/cpp/src/proto/Exprs.proto similarity index 100% rename from cpp/src/proto/Exprs.proto rename to native-sql-engine/cpp/src/proto/Exprs.proto diff --git a/cpp/src/proto/protobuf_utils.cc b/native-sql-engine/cpp/src/proto/protobuf_utils.cc similarity index 100% rename from cpp/src/proto/protobuf_utils.cc rename to native-sql-engine/cpp/src/proto/protobuf_utils.cc diff --git a/cpp/src/proto/protobuf_utils.h b/native-sql-engine/cpp/src/proto/protobuf_utils.h similarity index 100% rename from cpp/src/proto/protobuf_utils.h rename to native-sql-engine/cpp/src/proto/protobuf_utils.h diff --git a/cpp/src/resources/libhdfs.so b/native-sql-engine/cpp/src/resources/libhdfs.so similarity index 100% rename from cpp/src/resources/libhdfs.so rename to native-sql-engine/cpp/src/resources/libhdfs.so diff --git a/cpp/src/resources/libhdfs3.so b/native-sql-engine/cpp/src/resources/libhdfs3.so similarity index 100% rename from cpp/src/resources/libhdfs3.so rename to native-sql-engine/cpp/src/resources/libhdfs3.so diff --git a/cpp/src/resources/libprotobuf.so.13 b/native-sql-engine/cpp/src/resources/libprotobuf.so.13 similarity index 100% rename from cpp/src/resources/libprotobuf.so.13 rename to native-sql-engine/cpp/src/resources/libprotobuf.so.13 diff --git a/cpp/src/shuffle/splitter.cc b/native-sql-engine/cpp/src/shuffle/splitter.cc similarity index 100% rename from cpp/src/shuffle/splitter.cc rename to native-sql-engine/cpp/src/shuffle/splitter.cc diff --git a/cpp/src/shuffle/splitter.h b/native-sql-engine/cpp/src/shuffle/splitter.h similarity index 100% rename from cpp/src/shuffle/splitter.h rename to native-sql-engine/cpp/src/shuffle/splitter.h diff --git a/cpp/src/shuffle/type.h b/native-sql-engine/cpp/src/shuffle/type.h similarity index 100% rename from cpp/src/shuffle/type.h rename to native-sql-engine/cpp/src/shuffle/type.h diff --git a/cpp/src/shuffle/utils.h b/native-sql-engine/cpp/src/shuffle/utils.h similarity index 100% rename from cpp/src/shuffle/utils.h rename to native-sql-engine/cpp/src/shuffle/utils.h diff --git a/cpp/src/tests/CMakeLists.txt b/native-sql-engine/cpp/src/tests/CMakeLists.txt similarity index 100% rename from cpp/src/tests/CMakeLists.txt rename to native-sql-engine/cpp/src/tests/CMakeLists.txt diff --git a/cpp/src/tests/arrow_compute_test_aggregate.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_aggregate.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_aggregate.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_aggregate.cc diff --git a/cpp/src/tests/arrow_compute_test_aggregate_decimal.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_aggregate_decimal.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_aggregate_decimal.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_aggregate_decimal.cc diff --git a/cpp/src/tests/arrow_compute_test_check_condition.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_check_condition.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_check_condition.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_check_condition.cc diff --git a/cpp/src/tests/arrow_compute_test_join_smj.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_join_smj.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_join_smj.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_join_smj.cc diff --git a/cpp/src/tests/arrow_compute_test_join_wocg.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_join_wocg.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_join_wocg.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_join_wocg.cc diff --git a/cpp/src/tests/arrow_compute_test_precompile.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_precompile.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_precompile.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_precompile.cc diff --git a/cpp/src/tests/arrow_compute_test_sort.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_sort.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_sort.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_sort.cc diff --git a/cpp/src/tests/arrow_compute_test_window.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_window.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_window.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_window.cc diff --git a/cpp/src/tests/arrow_compute_test_wscg.cc b/native-sql-engine/cpp/src/tests/arrow_compute_test_wscg.cc similarity index 100% rename from cpp/src/tests/arrow_compute_test_wscg.cc rename to native-sql-engine/cpp/src/tests/arrow_compute_test_wscg.cc diff --git a/cpp/src/tests/shuffle_split_test.cc b/native-sql-engine/cpp/src/tests/shuffle_split_test.cc similarity index 100% rename from cpp/src/tests/shuffle_split_test.cc rename to native-sql-engine/cpp/src/tests/shuffle_split_test.cc diff --git a/cpp/src/tests/test_utils.h b/native-sql-engine/cpp/src/tests/test_utils.h similarity index 100% rename from cpp/src/tests/test_utils.h rename to native-sql-engine/cpp/src/tests/test_utils.h diff --git a/cpp/src/third_party/arrow/utils/hashing.h b/native-sql-engine/cpp/src/third_party/arrow/utils/hashing.h similarity index 100% rename from cpp/src/third_party/arrow/utils/hashing.h rename to native-sql-engine/cpp/src/third_party/arrow/utils/hashing.h diff --git a/cpp/src/third_party/arrow/vendored/xxhash/README.md b/native-sql-engine/cpp/src/third_party/arrow/vendored/xxhash/README.md similarity index 100% rename from cpp/src/third_party/arrow/vendored/xxhash/README.md rename to native-sql-engine/cpp/src/third_party/arrow/vendored/xxhash/README.md diff --git a/cpp/src/third_party/arrow/vendored/xxhash/xxh3.h b/native-sql-engine/cpp/src/third_party/arrow/vendored/xxhash/xxh3.h similarity index 100% rename from cpp/src/third_party/arrow/vendored/xxhash/xxh3.h rename to native-sql-engine/cpp/src/third_party/arrow/vendored/xxhash/xxh3.h diff --git a/cpp/src/third_party/arrow/vendored/xxhash/xxhash.c b/native-sql-engine/cpp/src/third_party/arrow/vendored/xxhash/xxhash.c similarity index 100% rename from cpp/src/third_party/arrow/vendored/xxhash/xxhash.c rename to native-sql-engine/cpp/src/third_party/arrow/vendored/xxhash/xxhash.c diff --git a/cpp/src/third_party/arrow/vendored/xxhash/xxhash.h b/native-sql-engine/cpp/src/third_party/arrow/vendored/xxhash/xxhash.h similarity index 100% rename from cpp/src/third_party/arrow/vendored/xxhash/xxhash.h rename to native-sql-engine/cpp/src/third_party/arrow/vendored/xxhash/xxhash.h diff --git a/cpp/src/third_party/datetime/README.md b/native-sql-engine/cpp/src/third_party/datetime/README.md similarity index 100% rename from cpp/src/third_party/datetime/README.md rename to native-sql-engine/cpp/src/third_party/datetime/README.md diff --git a/cpp/src/third_party/datetime/date.h b/native-sql-engine/cpp/src/third_party/datetime/date.h similarity index 100% rename from cpp/src/third_party/datetime/date.h rename to native-sql-engine/cpp/src/third_party/datetime/date.h diff --git a/cpp/src/third_party/gandiva/CMakeLists.txt b/native-sql-engine/cpp/src/third_party/gandiva/CMakeLists.txt similarity index 100% rename from cpp/src/third_party/gandiva/CMakeLists.txt rename to native-sql-engine/cpp/src/third_party/gandiva/CMakeLists.txt diff --git a/cpp/src/third_party/gandiva/decimal_ops.cc b/native-sql-engine/cpp/src/third_party/gandiva/decimal_ops.cc similarity index 100% rename from cpp/src/third_party/gandiva/decimal_ops.cc rename to native-sql-engine/cpp/src/third_party/gandiva/decimal_ops.cc diff --git a/cpp/src/third_party/gandiva/decimal_ops.h b/native-sql-engine/cpp/src/third_party/gandiva/decimal_ops.h similarity index 100% rename from cpp/src/third_party/gandiva/decimal_ops.h rename to native-sql-engine/cpp/src/third_party/gandiva/decimal_ops.h diff --git a/cpp/src/third_party/gandiva/epoch_time_point.h b/native-sql-engine/cpp/src/third_party/gandiva/epoch_time_point.h similarity index 100% rename from cpp/src/third_party/gandiva/epoch_time_point.h rename to native-sql-engine/cpp/src/third_party/gandiva/epoch_time_point.h diff --git a/cpp/src/third_party/gandiva/time.cc b/native-sql-engine/cpp/src/third_party/gandiva/time.cc similarity index 100% rename from cpp/src/third_party/gandiva/time.cc rename to native-sql-engine/cpp/src/third_party/gandiva/time.cc diff --git a/cpp/src/third_party/gandiva/time_constants.h b/native-sql-engine/cpp/src/third_party/gandiva/time_constants.h similarity index 100% rename from cpp/src/third_party/gandiva/time_constants.h rename to native-sql-engine/cpp/src/third_party/gandiva/time_constants.h diff --git a/cpp/src/third_party/gandiva/time_fields.h b/native-sql-engine/cpp/src/third_party/gandiva/time_fields.h similarity index 100% rename from cpp/src/third_party/gandiva/time_fields.h rename to native-sql-engine/cpp/src/third_party/gandiva/time_fields.h diff --git a/cpp/src/third_party/gandiva/types.h b/native-sql-engine/cpp/src/third_party/gandiva/types.h similarity index 100% rename from cpp/src/third_party/gandiva/types.h rename to native-sql-engine/cpp/src/third_party/gandiva/types.h diff --git a/cpp/src/third_party/murmurhash/murmurhash32.h b/native-sql-engine/cpp/src/third_party/murmurhash/murmurhash32.h similarity index 100% rename from cpp/src/third_party/murmurhash/murmurhash32.h rename to native-sql-engine/cpp/src/third_party/murmurhash/murmurhash32.h diff --git a/cpp/src/third_party/murmurhash/murmurhash64.h b/native-sql-engine/cpp/src/third_party/murmurhash/murmurhash64.h similarity index 100% rename from cpp/src/third_party/murmurhash/murmurhash64.h rename to native-sql-engine/cpp/src/third_party/murmurhash/murmurhash64.h diff --git a/cpp/src/third_party/row_wise_memory/hashMap.h b/native-sql-engine/cpp/src/third_party/row_wise_memory/hashMap.h similarity index 100% rename from cpp/src/third_party/row_wise_memory/hashMap.h rename to native-sql-engine/cpp/src/third_party/row_wise_memory/hashMap.h diff --git a/cpp/src/third_party/row_wise_memory/native_memory.h b/native-sql-engine/cpp/src/third_party/row_wise_memory/native_memory.h similarity index 100% rename from cpp/src/third_party/row_wise_memory/native_memory.h rename to native-sql-engine/cpp/src/third_party/row_wise_memory/native_memory.h diff --git a/cpp/src/third_party/row_wise_memory/unsafe_row.h b/native-sql-engine/cpp/src/third_party/row_wise_memory/unsafe_row.h similarity index 100% rename from cpp/src/third_party/row_wise_memory/unsafe_row.h rename to native-sql-engine/cpp/src/third_party/row_wise_memory/unsafe_row.h diff --git a/cpp/src/third_party/ska_sort.hpp b/native-sql-engine/cpp/src/third_party/ska_sort.hpp similarity index 100% rename from cpp/src/third_party/ska_sort.hpp rename to native-sql-engine/cpp/src/third_party/ska_sort.hpp diff --git a/cpp/src/third_party/sparsehash/dense_hash_map b/native-sql-engine/cpp/src/third_party/sparsehash/dense_hash_map similarity index 100% rename from cpp/src/third_party/sparsehash/dense_hash_map rename to native-sql-engine/cpp/src/third_party/sparsehash/dense_hash_map diff --git a/cpp/src/third_party/sparsehash/dense_hash_set b/native-sql-engine/cpp/src/third_party/sparsehash/dense_hash_set similarity index 100% rename from cpp/src/third_party/sparsehash/dense_hash_set rename to native-sql-engine/cpp/src/third_party/sparsehash/dense_hash_set diff --git a/cpp/src/third_party/sparsehash/internal/densehashtable.h b/native-sql-engine/cpp/src/third_party/sparsehash/internal/densehashtable.h similarity index 100% rename from cpp/src/third_party/sparsehash/internal/densehashtable.h rename to native-sql-engine/cpp/src/third_party/sparsehash/internal/densehashtable.h diff --git a/cpp/src/third_party/sparsehash/internal/hashtable-common.h b/native-sql-engine/cpp/src/third_party/sparsehash/internal/hashtable-common.h similarity index 100% rename from cpp/src/third_party/sparsehash/internal/hashtable-common.h rename to native-sql-engine/cpp/src/third_party/sparsehash/internal/hashtable-common.h diff --git a/cpp/src/third_party/sparsehash/internal/libc_allocator_with_realloc.h b/native-sql-engine/cpp/src/third_party/sparsehash/internal/libc_allocator_with_realloc.h similarity index 100% rename from cpp/src/third_party/sparsehash/internal/libc_allocator_with_realloc.h rename to native-sql-engine/cpp/src/third_party/sparsehash/internal/libc_allocator_with_realloc.h diff --git a/cpp/src/third_party/sparsehash/internal/sparsehashtable.h b/native-sql-engine/cpp/src/third_party/sparsehash/internal/sparsehashtable.h similarity index 100% rename from cpp/src/third_party/sparsehash/internal/sparsehashtable.h rename to native-sql-engine/cpp/src/third_party/sparsehash/internal/sparsehashtable.h diff --git a/cpp/src/third_party/sparsehash/sparse_hash_map b/native-sql-engine/cpp/src/third_party/sparsehash/sparse_hash_map similarity index 100% rename from cpp/src/third_party/sparsehash/sparse_hash_map rename to native-sql-engine/cpp/src/third_party/sparsehash/sparse_hash_map diff --git a/cpp/src/third_party/sparsehash/sparse_hash_map.h b/native-sql-engine/cpp/src/third_party/sparsehash/sparse_hash_map.h similarity index 100% rename from cpp/src/third_party/sparsehash/sparse_hash_map.h rename to native-sql-engine/cpp/src/third_party/sparsehash/sparse_hash_map.h diff --git a/cpp/src/third_party/sparsehash/sparse_hash_set b/native-sql-engine/cpp/src/third_party/sparsehash/sparse_hash_set similarity index 100% rename from cpp/src/third_party/sparsehash/sparse_hash_set rename to native-sql-engine/cpp/src/third_party/sparsehash/sparse_hash_set diff --git a/cpp/src/third_party/sparsehash/sparsetable b/native-sql-engine/cpp/src/third_party/sparsehash/sparsetable similarity index 100% rename from cpp/src/third_party/sparsehash/sparsetable rename to native-sql-engine/cpp/src/third_party/sparsehash/sparsetable diff --git a/cpp/src/third_party/sparsehash/traits b/native-sql-engine/cpp/src/third_party/sparsehash/traits similarity index 100% rename from cpp/src/third_party/sparsehash/traits rename to native-sql-engine/cpp/src/third_party/sparsehash/traits diff --git a/cpp/src/third_party/timsort.hpp b/native-sql-engine/cpp/src/third_party/timsort.hpp similarity index 100% rename from cpp/src/third_party/timsort.hpp rename to native-sql-engine/cpp/src/third_party/timsort.hpp diff --git a/cpp/src/utils/macros.h b/native-sql-engine/cpp/src/utils/macros.h similarity index 100% rename from cpp/src/utils/macros.h rename to native-sql-engine/cpp/src/utils/macros.h diff --git a/tools/gitdiff_AdaptiveSparkPlanExec.patch b/native-sql-engine/tools/gitdiff_AdaptiveSparkPlanExec.patch similarity index 100% rename from tools/gitdiff_AdaptiveSparkPlanExec.patch rename to native-sql-engine/tools/gitdiff_AdaptiveSparkPlanExec.patch diff --git a/tools/process.py b/native-sql-engine/tools/process.py similarity index 100% rename from tools/process.py rename to native-sql-engine/tools/process.py diff --git a/tools/run_ut.sh b/native-sql-engine/tools/run_ut.sh similarity index 100% rename from tools/run_ut.sh rename to native-sql-engine/tools/run_ut.sh diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..ecba8cd39 --- /dev/null +++ b/pom.xml @@ -0,0 +1,40 @@ + + + + 4.0.0 + com.intel.oap + native-sql-engine-parent + 1.1.0 + pom + + Native SQL Engine Parent Pom + https://github.com/oap-project/native-sql-engine.git + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + + + + arrow-data-source + native-sql-engine/core + + + diff --git a/scalastyle-config.xml b/scalastyle-config.xml new file mode 100644 index 000000000..4892819ae --- /dev/null +++ b/scalastyle-config.xml @@ -0,0 +1,386 @@ + + + + + Scalastyle standard configuration + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARROW, EQUALS, ELSE, TRY, CATCH, FINALLY, LARROW, RARROW + + + + + + ARROW, EQUALS, COMMA, COLON, IF, ELSE, DO, WHILE, FOR, MATCH, TRY, CATCH, FINALLY, LARROW, RARROW + + + + + + + + + ^FunSuite[A-Za-z]*$ + Tests must extend org.apache.spark.SparkFunSuite instead. + + + + + ^println$ + + + + + spark(.sqlContext)?.sparkContext.hadoopConfiguration + + + + + @VisibleForTesting + + + + + Runtime\.getRuntime\.addShutdownHook + + + + + mutable\.SynchronizedBuffer + + + + + Class\.forName + + + + + Await\.result + + + + + Await\.ready + + + + + (\.toUpperCase|\.toLowerCase)(?!(\(|\(Locale.ROOT\))) + + + + + throw new \w+Error\( + + + + + + JavaConversions + Instead of importing implicits in scala.collection.JavaConversions._, import + scala.collection.JavaConverters._ and use .asScala / .asJava methods + + + + org\.apache\.commons\.lang\. + Use Commons Lang 3 classes (package org.apache.commons.lang3.*) instead + of Commons Lang 2 (package org.apache.commons.lang.*) + + + + extractOpt + Use jsonOption(x).map(.extract[T]) instead of .extractOpt[T], as the latter + is slower. + + + + + java,scala,3rdParty,spark + javax?\..* + scala\..* + (?!org\.apache\.spark\.).* + org\.apache\.spark\..* + + + + + + COMMA + + + + + + \)\{ + + + + + (?m)^(\s*)/[*][*].*$(\r|)\n^\1 [*] + Use Javadoc style indentation for multiline comments + + + + case[^\n>]*=>\s*\{ + Omit braces in case clauses. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 800> + + + + + 30 + + + + + 10 + + + + + 50 + + + + + + + + + + + -1,0,1,2,3 + + +