You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2020/05/14 20:26:18 UTC

[asterixdb] 25/26: Merge commit 'aa7ff7b' from 'gerrit/mad-hatter'

This is an automated email from the ASF dual-hosted git repository.

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit 73d67804a7953b8327fe6290967eface3672b2b6
Merge: 54bff81 aa7ff7b
Author: Michael Blow <mb...@apache.org>
AuthorDate: Wed May 13 22:58:51 2020 -0400

    Merge commit 'aa7ff7b' from 'gerrit/mad-hatter'
    
    Change-Id: Ibfc874ca45692420fb86038537d10e172894730a

 asterixdb/asterix-app/data/csv/empty.csv           |   5 -
 .../data/csv/{empty.csv => empty_lines.csv}        |   0
 asterixdb/asterix-app/data/csv/error1_line_num.csv |   3 +
 asterixdb/asterix-app/data/csv/error2_line_num.csv |   5 +
 .../data/csv/header/h_invalid_values.csv           |  13 +
 .../asterix-app/data/csv/header/h_mul_rec.csv      |   4 +
 .../data/csv/header/h_mul_rec_with_ln.csv          |   4 +
 .../asterix-app/data/csv/header/h_one_rec.csv      |   2 +
 .../data/csv/header/h_one_rec_with_ln.csv          |   2 +
 asterixdb/asterix-app/data/csv/header/h_only.csv   |   1 +
 .../asterix-app/data/csv/header/h_only_with_ln.csv |   1 +
 .../data/csv/no_header/no_h_missing_fields.csv     |   3 +
 .../data/csv/no_header/no_h_mul_rec.csv            |   3 +
 .../data/csv/no_header/no_h_mul_rec_with_ln.csv    |   3 +
 .../data/csv/no_header/no_h_no_closing_q.csv       |   1 +
 .../data/csv/no_header/no_h_one_rec.csv            |   1 +
 .../data/csv/no_header/no_h_one_rec_with_ln.csv    |   1 +
 .../data/json/malformed-json-no-closing.json       |   2 +
 .../json/multi-lines-with-arrays/5-records.json    |  19 +
 .../multi-lines-with-nested-objects/5-records.json |  32 ++
 .../data/json/multi-lines/20-records.json          |  34 ++
 .../data/json/single-line/20-records.json          |  20 +
 .../jsonl/multi-lines-with-arrays/5-records.json   |  20 +
 .../multi-lines-with-nested-objects/5-records.json |  33 ++
 .../data/jsonl/multi-lines/20-records.json         |  33 ++
 .../data/jsonl/single-line/20-records.json         |  20 +
 .../csv_07/csv_07.1.adm => data/tsv/empty.tsv}     |   0
 .../data/{csv/empty.csv => tsv/empty_lines.tsv}    |   0
 .../asterix-app/data/tsv/header/h_mul_rec.tsv      |   4 +
 .../data/tsv/header/h_mul_rec_with_ln.tsv          |   4 +
 .../asterix-app/data/tsv/header/h_one_rec.tsv      |   2 +
 .../data/tsv/header/h_one_rec_with_ln.tsv          |   2 +
 asterixdb/asterix-app/data/tsv/header/h_only.tsv   |   1 +
 .../asterix-app/data/tsv/header/h_only_with_ln.tsv |   1 +
 .../data/tsv/no_header/no_h_missing_fields.tsv     |   3 +
 .../data/tsv/no_header/no_h_mul_rec.tsv            |   3 +
 .../data/tsv/no_header/no_h_mul_rec_with_ln.tsv    |   3 +
 .../data/tsv/no_header/no_h_one_rec.tsv            |   1 +
 .../data/tsv/no_header/no_h_one_rec_with_ln.tsv    |   1 +
 .../apache/asterix/api/http/server/ApiServlet.java |   3 +-
 .../api/http/server/QueryServiceServlet.java       |  13 +-
 .../api/http/server/RebalanceApiServlet.java       |   3 +-
 .../asterix/app/translator/QueryTranslator.java    |  38 +-
 .../test/common/CancellationTestExecutor.java      |   4 +-
 .../org/apache/asterix/test/common/IPollTask.java  |   5 +-
 .../asterix/test/common/ResultExtractor.java       |   4 +
 .../apache/asterix/test/common/TestExecutor.java   |  84 +++--
 .../aws/AwsS3ExternalDatasetOnePartitionTest.java  |  56 +++
 .../aws/AwsS3ExternalDatasetTest.java              | 413 ++++++++++++++++-----
 .../queries/group-by/gby-case-01.3.sqlpp}          |  12 +-
 .../queries/group-by/gby-case-01.4.sqlpp}          |  17 +-
 .../results/group-by/gby-case-01.3.plan            |  24 ++
 .../results/group-by/gby-case-01.4.plan            |  24 ++
 .../src/test/resources/runtimets/metrics.xml       |   5 +
 .../get-non-query/get-non-query.1.get.http}        |   8 +-
 .../get-non-query/get-non-query.2.get.http}        |  10 +-
 .../get-non-query/get-non-query.3.get.http}        |  10 +-
 .../get-query/get-query.1.get.http}                |  17 +-
 .../get-query/get-query.2.get.http}                |  17 +-
 .../get-query/get-query.3.get.http}                |  17 +-
 .../post-non-query/post-non-query.1.post.http}     |  10 +-
 .../post-non-query/post-non-query.2.post.http}     |  17 +-
 .../csv-parser-001/csv-parser-001.1.ddl.sqlpp      |   4 +-
 .../query-dataset.000.s3bucket.sqlpp}              |   4 +-
 .../query-dataset.001.ddl.sqlpp}                   |  18 +-
 .../query-dataset.002.query.sqlpp                  |   5 +-
 .../query-dataset.003.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.005.query.sqlpp}                 |   5 +-
 .../query-dataset.006.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.008.query.sqlpp}                 |   5 +-
 .../query-dataset.009.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.011.query.sqlpp}                 |   5 +-
 .../query-dataset.099.ddl.sqlpp}                   |   2 +-
 .../query-dataset.000.s3bucket.sqlpp}              |   4 +-
 .../query-dataset.001.ddl.sqlpp}                   |  16 +-
 .../query-dataset.002.query.sqlpp                  |   5 +-
 .../query-dataset.003.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.005.query.sqlpp}                 |   5 +-
 .../query-dataset.006.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.008.query.sqlpp}                 |   5 +-
 .../query-dataset.009.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.011.query.sqlpp}                 |   5 +-
 .../query-dataset.099.ddl.sqlpp}                   |   2 +-
 .../query-dataset.001.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.002.ddl.sqlpp}                   |  20 +-
 .../query-dataset.003.query.sqlpp}                 |   5 +-
 .../query-dataset.004.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.006.query.sqlpp}                 |   5 +-
 .../query-dataset.007.ddl.sqlpp}                   |  25 +-
 .../query-dataset.008.query.sqlpp}                 |   5 +-
 .../query-dataset.009.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.010.ddl.sqlpp}                   |  26 +-
 .../query-dataset.011.query.sqlpp}                 |   5 +-
 .../query-dataset.012.ddl.sqlpp}                   |  25 +-
 .../query-dataset.013.query.sqlpp}                 |   5 +-
 .../query-dataset.014.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.015.ddl.sqlpp}                   |  24 +-
 .../query-dataset.016.query.sqlpp}                 |   5 +-
 .../query-dataset.017.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.018.query.sqlpp}                 |   5 +-
 .../query-dataset.099.ddl.sqlpp}                   |   2 +-
 .../{001 => csv/csv}/query-dataset.000.ddl.sqlpp   |   9 +-
 .../{002 => csv/csv}/query-dataset.002.query.sqlpp |   0
 .../{002 => csv/csv}/query-dataset.003.ddl.sqlpp   |   0
 .../s3/{001 => csv/gz}/query-dataset.000.ddl.sqlpp |   9 +-
 .../{001 => csv/gz}/query-dataset.002.query.sqlpp  |   0
 .../s3/{001 => csv/gz}/query-dataset.003.ddl.sqlpp |   0
 .../{001 => csv/mixed}/query-dataset.000.ddl.sqlpp |   9 +-
 .../mixed}/query-dataset.002.query.sqlpp           |   0
 .../{002 => csv/mixed}/query-dataset.003.ddl.sqlpp |   0
 .../external_dataset.000.ddl.sqlpp                 |  11 +-
 .../external_dataset.001.query.sqlpp               |   4 +-
 .../external_dataset.099.ddl.sqlpp}                |   0
 .../json-warnings.001.s3bucket.sqlpp}              |   2 +-
 .../json-warnings.002.ddl.sqlpp}                   |  17 +-
 .../json-warnings.003.query.sqlpp}                 |   5 +-
 .../json-warnings.099.ddl.sqlpp}                   |   2 +-
 .../aws/s3/json/gz/external_dataset.000.ddl.sqlpp  |  70 ++++
 .../gz}/external_dataset.001.query.sqlpp           |   4 +-
 .../gz/external_dataset.002.query.sqlpp}           |   4 +-
 .../gz/external_dataset.003.query.sqlpp}           |   4 +-
 .../gz/external_dataset.004.query.sqlpp}           |   4 +-
 .../gz/external_dataset.005.query.sqlpp}           |   4 +-
 .../gz/external_dataset.006.query.sqlpp}           |   4 +-
 .../gz/external_dataset.007.ddl.sqlpp}             |   0
 .../s3/json/json/external_dataset.000.ddl.sqlpp    |  70 ++++
 .../json}/external_dataset.001.query.sqlpp         |   4 +-
 .../json/external_dataset.002.query.sqlpp}         |   4 +-
 .../json/external_dataset.003.query.sqlpp}         |   4 +-
 .../json/external_dataset.004.query.sqlpp}         |   4 +-
 .../json/external_dataset.005.query.sqlpp}         |   4 +-
 .../json/external_dataset.006.query.sqlpp}         |   4 +-
 .../json/external_dataset.007.ddl.sqlpp}           |   0
 .../s3/json/mixed/external_dataset.000.ddl.sqlpp   |  70 ++++
 .../mixed}/external_dataset.001.query.sqlpp        |   4 +-
 .../mixed/external_dataset.002.query.sqlpp}        |   4 +-
 .../mixed/external_dataset.003.query.sqlpp}        |   4 +-
 .../mixed/external_dataset.004.query.sqlpp}        |   4 +-
 .../mixed/external_dataset.005.query.sqlpp}        |   4 +-
 .../mixed/external_dataset.006.query.sqlpp}        |   4 +-
 .../mixed/external_dataset.007.ddl.sqlpp}          |   0
 .../query-dataset.000.s3bucket.sqlpp}              |   6 +-
 .../query-dataset.001.ddl.sqlpp}                   |  24 +-
 .../{002 => jsonl}/query-dataset.002.query.sqlpp   |   5 +-
 .../query-dataset.099.ddl.sqlpp}                   |   2 +-
 .../aws/s3/negative/negative.000.ddl.sqlpp         |   4 +-
 .../query-dataset.000.s3bucket.sqlpp}              |   4 +-
 .../query-dataset.001.ddl.sqlpp}                   |  18 +-
 .../query-dataset.002.query.sqlpp                  |   5 +-
 .../query-dataset.003.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.005.query.sqlpp}                 |   5 +-
 .../query-dataset.006.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.008.query.sqlpp}                 |   5 +-
 .../query-dataset.009.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.011.query.sqlpp}                 |   5 +-
 .../query-dataset.099.ddl.sqlpp}                   |   0
 .../query-dataset.000.s3bucket.sqlpp}              |   4 +-
 .../query-dataset.001.ddl.sqlpp}                   |  16 +-
 .../query-dataset.002.query.sqlpp                  |   5 +-
 .../query-dataset.003.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.005.query.sqlpp}                 |   5 +-
 .../query-dataset.006.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.008.query.sqlpp}                 |   5 +-
 .../query-dataset.009.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.011.query.sqlpp}                 |   5 +-
 .../query-dataset.099.ddl.sqlpp}                   |   2 +-
 .../query-dataset.001.s3bucket.sqlpp}              |   2 +-
 .../query-dataset.002.ddl.sqlpp}                   |  16 +-
 .../query-dataset.003.query.sqlpp}                 |   5 +-
 .../query-dataset.099.ddl.sqlpp}                   |   2 +-
 .../s3/{002 => tsv/gz}/query-dataset.000.ddl.sqlpp |   9 +-
 .../{002 => tsv/gz}/query-dataset.002.query.sqlpp  |   0
 .../s3/{002 => tsv/gz}/query-dataset.003.ddl.sqlpp |   0
 .../{002 => tsv/mixed}/query-dataset.000.ddl.sqlpp |   9 +-
 .../mixed}/query-dataset.002.query.sqlpp           |   0
 .../{002 => tsv/mixed}/query-dataset.003.ddl.sqlpp |   0
 .../{002 => tsv/tsv}/query-dataset.000.ddl.sqlpp   |   9 +-
 .../{002 => tsv/tsv}/query-dataset.002.query.sqlpp |   0
 .../{002 => tsv/tsv}/query-dataset.003.ddl.sqlpp   |   0
 .../gby-case-01/gby-case-01.1.ddl.sqlpp}           |  13 +-
 .../gby-case-01/gby-case-01.2.update.sqlpp}        |  43 ++-
 .../gby-case-01/gby-case-01.3.query.sqlpp}         |   9 +-
 .../gby-case-01/gby-case-01.4.query.sqlpp}         |   7 +-
 .../gby-nested-01/gby-nested-01.1.ddl.sqlpp}       |   9 +-
 .../gby-nested-01/gby-nested-01.2.update.sqlpp     |  66 ++++
 .../gby-nested-01/gby-nested-01.3.query.sqlpp}     |  25 +-
 .../loj-02-push-select.01.ddl.sqlpp}               |  13 +-
 .../loj-02-push-select.02.update.sqlpp}            |  15 +-
 .../loj-02-push-select.03.query.sqlpp}             |  15 +-
 .../loj-02-push-select.04.query.sqlpp}             |  16 +-
 .../loj-02-push-select.05.query.sqlpp}             |  29 +-
 .../loj-02-push-select.06.query.sqlpp}             |  29 +-
 .../load/csv_01/csv_01.2.update.sqlpp              |   2 +-
 .../load/csv_02/csv_02.2.update.sqlpp              |   2 +-
 .../load/csv_03/csv_03.2.update.sqlpp              |   2 +-
 .../load/csv_08_header_cr/csv_08.2.update.sqlpp    |   2 +-
 .../load/csv_08_header_crlf/csv_08.2.update.sqlpp  |   2 +-
 .../load/csv_08_header_lf/csv_08.2.update.sqlpp    |   2 +-
 .../external-dataset/external-dataset.1.ddl.sqlpp} |  11 +-
 .../external-dataset.2.metrics.sqlpp}              |   6 +-
 .../external-datasett.3.ddl.sqlpp}                 |   6 +-
 .../queries_sqlpp/objects/ObjectsQueries.xml       |   2 +-
 .../queries_sqlpp/tpcds/q19/q19.2.update.sqlpp     |  12 +-
 .../queries_sqlpp/tpcds/q25/q25.2.update.sqlpp     |  12 +-
 .../queries_sqlpp/tpcds/q29/q29.2.update.sqlpp     |  12 +-
 .../queries_sqlpp/tpcds/q30/q30.2.update.sqlpp     |   8 +-
 .../queries_sqlpp/tpcds/q34/q34.2.update.sqlpp     |  10 +-
 .../queries_sqlpp/tpcds/q43/q43.2.update.sqlpp     |   6 +-
 .../queries_sqlpp/tpcds/q46/q46.2.update.sqlpp     |  12 +-
 .../queries_sqlpp/tpcds/q50/q50.2.update.sqlpp     |   8 +-
 .../queries_sqlpp/tpcds/q57/q57.2.update.sqlpp     |   8 +-
 .../queries_sqlpp/tpcds/q59/q59.2.update.sqlpp     |   6 +-
 .../queries_sqlpp/tpcds/q62/q62.2.update.sqlpp     |  10 +-
 .../queries_sqlpp/tpcds/q63/q63.2.update.sqlpp     |   8 +-
 .../queries_sqlpp/tpcds/q73/q73.2.update.sqlpp     |  10 +-
 .../queries_sqlpp/tpcds/q79/q79.2.update.sqlpp     |  10 +-
 .../queries_sqlpp/tpcds/q81/q81.2.update.sqlpp     |   8 +-
 .../queries_sqlpp/tpcds/q85/q85.2.update.sqlpp     |  14 +-
 .../queries_sqlpp/tpcds/q88/q88.2.update.sqlpp     |   8 +-
 .../queries_sqlpp/tpcds/q89/q89.2.update.sqlpp     |   8 +-
 .../queries_sqlpp/tpcds/q90/q90.2.update.sqlpp     |   8 +-
 .../queries_sqlpp/tpcds/q91/q91.2.update.sqlpp     |  14 +-
 .../queries_sqlpp/tpcds/q96/q96.2.update.sqlpp     |   8 +-
 .../query-ASTERIXDB-1591.2.update.sqlpp            |  14 +-
 .../query-ASTERIXDB-1596.2.update.sqlpp            |   6 +-
 .../results/api/get-query/get-query.1.adm          |   1 +
 .../results/api/get-query/get-query.2.adm          |   1 +
 .../results/api/get-query/get-query.3.adm          |   1 +
 .../api/post-non-query/post-non-query.2.adm        |   1 +
 .../aws/s3/000/external_dataset.001.adm            |  14 -
 .../aws/s3/001/external_dataset.001.adm            |   6 -
 .../aws/s3/002/external_dataset.001.adm            |   6 -
 .../aws/s3/csv-header/external_dataset.001.adm}    |   0
 .../aws/s3/csv-header/external_dataset.002.adm}    |   0
 .../aws/s3/csv-header/external_dataset.003.adm     |   2 +
 .../aws/s3/csv-header/external_dataset.004.adm     |   6 +
 .../aws/s3/csv-no-header/external_dataset.001.adm} |   0
 .../aws/s3/csv-no-header/external_dataset.002.adm} |   0
 .../aws/s3/csv-no-header/external_dataset.003.adm  |   2 +
 .../aws/s3/csv-no-header/external_dataset.004.adm  |   6 +
 .../aws/s3/csv-warnings/external_dataset.001.adm   |   2 +
 .../aws/s3/csv-warnings/external_dataset.002.adm   |   1 +
 .../aws/s3/csv-warnings/external_dataset.003.adm   |   1 +
 .../aws/s3/csv-warnings/external_dataset.004.adm   |   3 +
 .../aws/s3/csv-warnings/external_dataset.005.adm   |   3 +
 .../aws/s3/csv-warnings/external_dataset.006.adm   |   1 +
 .../aws/s3/csv-warnings/external_dataset.007.adm   |   2 +
 .../aws/s3/csv/csv/external_dataset.001.adm        |  30 ++
 .../aws/s3/csv/gz/external_dataset.001.adm         |  30 ++
 .../aws/s3/csv/mixed/external_dataset.001.adm      |  60 +++
 .../external_dataset.001.adm                       |   1 +
 .../aws/s3/json-warnings/json-warnings.003.adm     |   1 +
 .../aws/s3/json/gz/external_dataset.001.adm        |   1 +
 .../aws/s3/json/gz/external_dataset.002.adm        |   1 +
 .../aws/s3/json/gz/external_dataset.003.adm        |   1 +
 .../aws/s3/json/gz/external_dataset.004.adm        |  25 ++
 .../aws/s3/json/gz/external_dataset.005.adm        |   1 +
 .../aws/s3/json/gz/external_dataset.006.adm        |  25 ++
 .../aws/s3/json/json/external_dataset.001.adm      |   1 +
 .../aws/s3/json/json/external_dataset.002.adm      |   1 +
 .../aws/s3/json/json/external_dataset.003.adm      |   1 +
 .../aws/s3/json/json/external_dataset.004.adm      |  25 ++
 .../aws/s3/json/json/external_dataset.005.adm      |   1 +
 .../aws/s3/json/json/external_dataset.006.adm      |  25 ++
 .../aws/s3/json/mixed/external_dataset.001.adm     |   1 +
 .../aws/s3/json/mixed/external_dataset.002.adm     |   1 +
 .../aws/s3/json/mixed/external_dataset.003.adm     |   1 +
 .../aws/s3/json/mixed/external_dataset.004.adm     |  50 +++
 .../aws/s3/json/mixed/external_dataset.005.adm     |   1 +
 .../aws/s3/json/mixed/external_dataset.006.adm     |  50 +++
 .../aws/s3/jsonl/external_dataset.002.adm          |  50 +++
 .../aws/s3/tsv-header/external_dataset.001.adm}    |   0
 .../aws/s3/tsv-header/external_dataset.002.adm}    |   0
 .../aws/s3/tsv-header/external_dataset.003.adm     |   2 +
 .../aws/s3/tsv-header/external_dataset.004.adm     |   6 +
 .../aws/s3/tsv-no-header/external_dataset.001.adm} |   0
 .../aws/s3/tsv-no-header/external_dataset.002.adm} |   0
 .../aws/s3/tsv-no-header/external_dataset.003.adm  |   2 +
 .../aws/s3/tsv-no-header/external_dataset.004.adm  |   6 +
 .../aws/s3/tsv-warnings/external_dataset.001.adm   |   2 +
 .../aws/s3/tsv/gz/external_dataset.001.adm         |  30 ++
 .../aws/s3/tsv/mixed/external_dataset.001.adm      |  60 +++
 .../aws/s3/tsv/tsv/external_dataset.001.adm        |  30 ++
 .../results/group-by/gby-case-01/gby-case-01.3.adm |   2 +
 .../results/group-by/gby-case-01/gby-case-01.4.adm |   2 +
 .../group-by/gby-nested-01/gby-nested-01.3.adm     |   2 +
 .../loj-02-push-select/loj-02-push-select.03.adm   |   2 +
 .../loj-02-push-select/loj-02-push-select.04.adm   |   2 +
 .../loj-02-push-select/loj-02-push-select.05.adm   |   2 +
 .../loj-02-push-select/loj-02-push-select.06.adm   |   2 +
 .../runtimets/results/load/csv_06/csv_06.1.adm     |   3 +
 .../runtimets/results/load/csv_07/csv_07.1.adm     |   3 +
 .../external-dataset/external-dataset.2.regexadm   |   1 +
 .../src/test/resources/runtimets/testsuite.xml     |   3 -
 .../runtimets/testsuite_external_dataset.xml       |  45 ++-
 .../testsuite_external_dataset_one_partition.xml   |  91 +++++
 .../test/resources/runtimets/testsuite_sqlpp.xml   |  73 ++--
 .../asterix/common/exceptions/ErrorCode.java       |   6 +-
 .../common/external/IDataSourceAdapter.java        |   7 +
 .../src/main/resources/asx_errormsg/en.properties  |   2 +-
 asterixdb/asterix-dashboard/pom.xml                | 235 ++++++------
 .../asterix/external/api/AsterixInputStream.java   |   8 +
 .../asterix/external/api/IDataFlowController.java  |   7 +
 .../asterix/external/api/IRecordConverter.java     |   9 +
 .../asterix/external/api/IRecordDataParser.java    |  26 +-
 .../apache/asterix/external/api/IRecordReader.java |  11 +
 .../dataflow/AbstractDataFlowController.java       |   6 +
 .../dataflow/FeedRecordDataFlowController.java     |   7 +-
 .../dataflow/RecordDataFlowController.java         |  11 +-
 .../dataflow/StreamDataFlowController.java         |   2 +
 .../external/dataset/adapter/FeedAdapter.java      |   5 +
 .../external/dataset/adapter/GenericAdapter.java   |   5 +
 .../external/dataset/adapter/LookupAdapter.java    |   7 +-
 .../external/input/record/CharArrayRecord.java     |   4 +-
 .../input/record/RecordWithMetadataAndPK.java      |   4 +-
 .../CSVToRecordWithMetadataAndPKConverter.java     |  24 +-
 .../converter/CSVWithRecordConverterFactory.java   |   5 +-
 .../record/converter/DCPConverterFactory.java      |   3 +-
 .../record/converter/IRecordConverterFactory.java  |   3 +-
 .../input/record/reader/aws/AwsS3InputStream.java  |  89 +++--
 .../record/reader/aws/AwsS3InputStreamFactory.java |  26 +-
 .../stream/EmptyLineSeparatedRecordReader.java     |   2 +-
 .../record/reader/stream/LineRecordReader.java     |  57 +--
 .../reader/stream/QuotedLineRecordReader.java      |  92 +++--
 .../reader/stream/SemiStructuredRecordReader.java  | 164 +++++---
 .../record/reader/stream/StreamRecordReader.java   |  35 +-
 .../input/stream/AbstractMultipleInputStream.java  |  78 ++++
 .../input/stream/AsterixInputStreamReader.java     |   8 +
 .../external/input/stream/LocalFSInputStream.java  |  97 +++--
 .../operators/ExternalScanOperatorDescriptor.java  |  11 +-
 .../asterix/external/parser/ADMDataParser.java     |  10 +-
 .../external/parser/DelimitedDataParser.java       | 162 ++++++--
 .../asterix/external/parser/HiveRecordParser.java  |   3 +-
 .../asterix/external/parser/JSONDataParser.java    |   3 +-
 .../apache/asterix/external/parser/RSSParser.java  |   3 +-
 .../external/parser/RecordWithMetadataParser.java  |  13 +-
 .../external/parser/RecordWithPKDataParser.java    |   5 +-
 .../asterix/external/parser/TweetParser.java       |   3 +-
 .../parser/factory/DelimitedDataParserFactory.java |   3 +-
 .../factory/RecordWithMetadataParserFactory.java   |   2 +-
 .../provider/DataflowControllerProvider.java       |   6 +
 .../external/util/ExternalDataConstants.java       |  24 +-
 .../asterix/external/util/ExternalDataUtils.java   |  99 +++--
 .../apache/asterix/external/util/ParseUtil.java    |  36 +-
 .../external/parser/TestRecordWithPKParser.java    |   4 +-
 .../external/parser/test/RecordWithMetaTest.java   |  21 +-
 .../external/parser/test/TweetParserTest.java      |   9 +-
 .../sqlpp/rewrites/SqlppFunctionBodyRewriter.java  |   3 +
 .../lang/sqlpp/rewrites/SqlppQueryRewriter.java    |  11 +-
 .../AbstractSqlppExpressionExtractionVisitor.java  |  91 ++++-
 .../rewrites/visitor/SqlppCaseRewriteVisitor.java  | 104 ++++++
 .../visitor/SqlppWindowRewriteVisitor.java         |  18 +-
 .../om/base/temporal/ADateParserFactory.java       |   9 +-
 .../om/base/temporal/ADateTimeParserFactory.java   |   3 +-
 .../om/base/temporal/ADurationParserFactory.java   |   3 +-
 .../om/base/temporal/ATimeParserFactory.java       |   7 +-
 .../ABinaryHexStringConstructorDescriptor.java     |   5 +-
 asterixdb/asterix-server/pom.xml                   |  24 ++
 asterixdb/pom.xml                                  |  54 ++-
 .../appended-resources/supplemental-models.xml     | 227 +++++++++++
 ...tent.com_aws_aws-sdk-java-v2_2.10.83_NOTICE.txt |  16 +
 ...dd80e12f8835674c8ffb0f4a2efb64c7b585_NOTICE.txt |   2 +
 .../AbstractIntroduceGroupByCombinerRule.java      |   6 +
 .../rewriter/rules/PushSelectIntoJoinRule.java     |  91 +++--
 .../apache/hyracks/api/exceptions/ErrorCode.java   |   1 +
 .../org/apache/hyracks/api/util/CleanupUtils.java  |   4 +-
 .../hyracks/api/util/HyracksThrowingConsumer.java  |   9 +-
 .../src/main/resources/errormsg/en.properties      |   1 +
 .../common/data/parsers/BooleanParserFactory.java  |  51 ++-
 .../data/parsers/ByteArrayBase64ParserFactory.java |   3 +-
 .../data/parsers/ByteArrayHexParserFactory.java    |   3 +-
 .../common/data/parsers/DoubleParserFactory.java   |   5 +-
 .../common/data/parsers/FloatParserFactory.java    |   5 +-
 .../dataflow/common/data/parsers/IValueParser.java |   2 +-
 .../common/data/parsers/IntegerParserFactory.java  | 122 +++---
 .../common/data/parsers/LongParserFactory.java     | 123 +++---
 .../data/parsers/UTF8StringParserFactory.java      |   3 +-
 .../parsers/ByteArrayBase64ParserFactoryTest.java  |   3 +-
 .../parsers/ByteArrayHexParserFactoryTest.java     |   3 +-
 .../common/data/parsers/ParserFactoryTest.java     | 218 +++++++++++
 .../std/file/DelimitedDataTupleParserFactory.java  |  27 +-
 .../file/FieldCursorForDelimitedDataParser.java    | 100 +++--
 .../dataflow/std/join/OptimizedHybridHashJoin.java |  14 +
 .../OptimizedHybridHashJoinOperatorDescriptor.java |  21 +-
 .../hyracks/dataflow/std/file/CursorTest.java      |  11 +-
 .../examples/text/WordTupleParserFactory.java      |   4 +-
 .../hyracks/http/server/AbstractServlet.java       |   3 +-
 .../apache/hyracks/http/server/utils/HttpUtil.java |  42 ++-
 .../apache/hyracks/maven/license/LicenseMojo.java  |  42 ++-
 .../org/apache/hyracks/maven/license/Override.java |  10 +
 .../org/apache/hyracks/util/ThrowingConsumer.java  |   6 +-
 hyracks-fullstack/pom.xml                          |  68 ++--
 392 files changed, 4666 insertions(+), 1643 deletions(-)

diff --cc asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
index 62b96bc,e7afd44..b47960b
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
@@@ -166,11 -166,11 +167,11 @@@ public class RebalanceApiServlet extend
      }
  
      // Performs the actual rebalance.
 -    private Void doRebalance(String dataverseName, String datasetName, String[] targetNodes, IServletResponse response,
 -            CountDownLatch terminated) {
 +    private Void doRebalance(DataverseName dataverseName, String datasetName, String[] targetNodes,
 +            IServletResponse response, CountDownLatch terminated) {
          try {
              // Sets the content type.
-             HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
+             HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, StandardCharsets.UTF_8);
  
              if (datasetName == null) {
                  // Rebalances datasets in a given dataverse or all non-metadata datasets.
diff --cc asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index ea2ce40,818fbd4..f2302f9
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@@ -915,9 -875,10 +915,10 @@@ public class QueryTranslator extends Ab
              IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception {
          CreateIndexStatement stmtCreateIndex = (CreateIndexStatement) stmt;
          SourceLocation sourceLoc = stmtCreateIndex.getSourceLocation();
 -        String dataverseName = getActiveDataverse(stmtCreateIndex.getDataverseName());
 +        DataverseName dataverseName = getActiveDataverseName(stmtCreateIndex.getDataverseName());
          String datasetName = stmtCreateIndex.getDatasetName().getValue();
          String indexName = stmtCreateIndex.getIndexName().getValue();
+         IndexType indexType = stmtCreateIndex.getIndexType();
          List<Integer> keySourceIndicators = stmtCreateIndex.getFieldSourceIndicators();
          MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
          metadataProvider.setMetadataTxnContext(mdTxnCtx);
@@@ -930,7 -895,10 +931,10 @@@
                          dataverseName);
              }
  
+             DatasetType datasetType = ds.getDatasetType();
+             validateIndexType(datasetType, indexType, isSecondaryPrimary, sourceLoc);
+ 
 -            index = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(), dataverseName,
 +            Index index = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(), dataverseName,
                      datasetName, indexName);
              if (index != null) {
                  if (stmtCreateIndex.getIfNotExists()) {
diff --cc asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
index eb91675,ed0c802..190b7b0
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
@@@ -166,14 -104,17 +166,18 @@@ public class ResultExtractor 
          return extract(resultStream, EnumSet.of(ResultField.PROFILE), resultCharset).getResult();
      }
  
 -    public static InputStream extractPlans(InputStream resultStream, Charset resultCharset) throws Exception {
 -        return extract(resultStream, EnumSet.of(ResultField.PLANS), resultCharset).getResult();
 +    public static InputStream extractPlans(InputStream resultStream, Charset resultCharset, String[] plans)
 +            throws Exception {
 +        return extract(resultStream, EnumSet.of(ResultField.PLANS), resultCharset, OutputFormat.ADM, plans).getResult();
      }
  
+     public static InputStream extractStatus(InputStream resultStream, Charset resultCharset) throws Exception {
+         return extract(resultStream, EnumSet.of(ResultField.STATUS), resultCharset).getResult();
+     }
+ 
      public static String extractHandle(InputStream resultStream, Charset responseCharset) throws Exception {
          String result = IOUtils.toString(resultStream, responseCharset);
 -        ObjectNode resultJson = OBJECT_MAPPER.readValue(result, ObjectNode.class);
 +        ObjectNode resultJson = OBJECT_READER.readValue(result);
          final JsonNode handle = resultJson.get("handle");
          if (handle != null) {
              return handle.asText();
diff --cc asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index bcaa397,3bed78a..ca10f51
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@@ -13925,280 -12987,5 +13953,281 @@@
          <expected-warn>Invalid value: function substring expects its 2nd input parameter to be an integer value, got Infinity (in line 34, at column 1)</expected-warn>
        </compilation-unit>
      </test-case>
 +    <test-case FilePath="fun_return_null/string_fun" check-warnings="true">
 +      <compilation-unit name="string_fun_004">
 +        <output-dir compare="Text">string_fun_004</output-dir>
 +        <expected-warn>Type mismatch: function string-concat expects its 2nd input parameter to be of type string, but the actual input type is tinyint (in line 30, at column 1)</expected-warn>
 +        <expected-warn>Type mismatch: function substring expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string (in line 32, at column 1)</expected-warn>
 +        <expected-warn>Type mismatch: function substring expects its 1st input parameter to be of type string, but the actual input type is bigint (in line 33, at column 1)</expected-warn>
 +        <expected-warn>Type mismatch: function string-concat expects its 2nd input parameter to be of type string, but the actual input type is bigint (in line 31, at column 7)</expected-warn>
 +        <expected-warn>Type mismatch: function codepoint-to-string expects its 1st input parameter to be of type array, but the actual input type is string (in line 34, at column 1)</expected-warn>
 +        <expected-warn>Unsupported type: codepoint-to-string cannot process input type string (in line 35, at column 1)</expected-warn>
 +
 +        <expected-warn>Type mismatch: function string-concat expects its 2nd input parameter to be of type string, but the actual input type is tinyint (in line 30, at column 1)</expected-warn>
 +        <expected-warn>Type mismatch: function substring expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string (in line 32, at column 1)</expected-warn>
 +        <expected-warn>Type mismatch: function substring expects its 1st input parameter to be of type string, but the actual input type is bigint (in line 33, at column 1)</expected-warn>
 +        <expected-warn>Type mismatch: function string-concat expects its 2nd input parameter to be of type string, but the actual input type is bigint (in line 31, at column 7)</expected-warn>
 +        <expected-warn>Type mismatch: function codepoint-to-string expects its 1st input parameter to be of type array, but the actual input type is string (in line 34, at column 1)</expected-warn>
 +        <expected-warn>Unsupported type: codepoint-to-string cannot process input type string (in line 35, at column 1)</expected-warn>
 +
 +        <expected-warn>Type mismatch: function string-concat expects its 2nd input parameter to be of type string, but the actual input type is bigint (in line 30, at column 1)</expected-warn>
 +        <expected-warn>Type mismatch: function string-concat expects its 2nd input parameter to be of type string, but the actual input type is tinyint (in line 31, at column 7)</expected-warn>
-         <expected-warn>Type mismatch: function substring expects its 1st input parameter to be of type string, but the actual input type is bigint (in line 32, at column 1)</expected-warn>
++        <expected-warn>Type mismatch: function substring expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string (in line 32, at column 1)</expected-warn>
 +        <expected-warn>Type mismatch: function codepoint-to-string expects its 1st input parameter to be of type array, but the actual input type is string (in line 33, at column 1)</expected-warn>
 +        <expected-warn>Unsupported type: codepoint-to-string cannot process input type string (in line 34, at column 1)</expected-warn>
 +        <expected-warn>Unsupported type: codepoint-to-string cannot process input type double (in line 35, at column 1)</expected-warn>
 +      </compilation-unit>
 +    </test-case>
 +  </test-group>
 +  <test-group name="fun_return_null/numeric_fun" >
 +    <test-case FilePath="fun_return_null/numeric_fun" check-warnings="true">
 +      <compilation-unit name="numeric_fun_001">
 +        <output-dir compare="Text">numeric_fun_001</output-dir>
 +        <expected-warn>Type mismatch: function abs expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function acos expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string </expected-warn>
 +        <expected-warn>Type mismatch: function asin expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function atan expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function atan2 expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function degrees expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function radians expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function cos expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function cosh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sin expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sinh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function tan expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function tanh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function exp expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function ln expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function log expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sqrt expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sign expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function ceiling expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function floor expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round-half-to-even expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-unary-minus expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function random expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +
 +        <expected-warn>Type mismatch: function abs expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function acos expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string </expected-warn>
 +        <expected-warn>Type mismatch: function asin expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function atan expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function atan2 expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function degrees expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function radians expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function cos expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function cosh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sin expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sinh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function tan expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function tanh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function exp expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function ln expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function log expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sqrt expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sign expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function ceiling expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function floor expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round-half-to-even expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-unary-minus expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function random expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +
 +        <expected-warn>Type mismatch: function abs expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function acos expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string </expected-warn>
 +        <expected-warn>Type mismatch: function asin expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function atan expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function atan2 expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function degrees expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function radians expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function cos expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function cosh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sin expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sinh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function tan expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function tanh expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function exp expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function ln expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function log expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sqrt expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function sign expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function ceiling expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function floor expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round-half-to-even expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-unary-minus expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function random expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <source-location>false</source-location>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="fun_return_null/numeric_fun" check-warnings="true">
 +      <compilation-unit name="numeric_fun_002">
 +        <output-dir compare="Text">numeric_fun_002</output-dir>
 +        <expected-warn>Type mismatch: function round expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round-half-to-even expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function trunc expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round-half-to-even expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function trunc expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round expects its 2nd input parameter to be of type tinyint, smallint, integer or bigint, but the actual input type is string</expected-warn>
 +
 +        <expected-warn>Type mismatch: function round expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round-half-to-even expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function trunc expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function round-half-to-even expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function trunc expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
 +
-         <expected-warn>Type mismatch: function round expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
-         <expected-warn>Type mismatch: function round-half-to-even expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
-         <expected-warn>Type mismatch: function trunc expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
-         <expected-warn>Type mismatch: function round expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
-         <expected-warn>Type mismatch: function round-half-to-even expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
-         <expected-warn>Type mismatch: function trunc expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string</expected-warn>
++        <expected-warn>Type mismatch: function round expects its 2nd input parameter to be of type tinyint, smallint, integer or bigint, but the actual input type is string (in line 33, at column 24)</expected-warn>
++        <expected-warn>Type mismatch: function round expects its 2nd input parameter to be of type tinyint, smallint, integer or bigint, but the actual input type is string (in line 33, at column 47)</expected-warn>
++        <expected-warn>Type mismatch: function trunc expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string (in line 34, at column 24)</expected-warn>
++        <expected-warn>Type mismatch: function trunc expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string (in line 34, at column 47)</expected-warn>
++
++        <expected-warn>Type mismatch: function round-half-to-even expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string (in line 36, at column 40)</expected-warn>
++        <expected-warn>Type mismatch: function round-half-to-even expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float or double, but the actual input type is string (in line 36, at column 79)</expected-warn>
 +        <source-location>false</source-location>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="fun_return_null/numeric_fun" check-warnings="true">
 +      <compilation-unit name="numeric_fun_003">
 +        <output-dir compare="Text">numeric_fun_003</output-dir>
 +        <expected-warn>Type mismatch: function numeric-add expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-divide expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-multiply gets incompatible input values: daytimeduration and string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-add expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-subtract expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-divide gets incompatible input values: time and string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-add gets incompatible input values: yearmonthduration and string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-subtract expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-multiply expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-add gets incompatible input values: daytimeduration and string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-div expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-subtract expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function power expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-mod expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-add gets incompatible input values: time and string</expected-warn>
 +        <expected-warn>Type incompatibility: function power gets incompatible input values: yearmonthduration and string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-multiply expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-multiply expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-mod expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-divide expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-div expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-multiply gets incompatible input values: date and string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-add expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-add gets incompatible input values: duration and string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-div gets incompatible input values: datetime and string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-mod expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function power expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-add gets incompatible input values: date and string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-mod gets incompatible input values: duration and string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-subtract expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-subtract expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-divide expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-subtract expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-subtract expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-div expects its 2nd input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type mismatch: function numeric-subtract expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <expected-warn>Type incompatibility: function numeric-add gets incompatible input values: datetime and string</expected-warn>
 +        <expected-warn>Type mismatch: function power expects its 1st input parameter to be of type tinyint, smallint, integer, bigint, float, double, date, time, datetime, duration, yearmonthduration or daytimeduration, but the actual input type is string</expected-warn>
 +        <source-location>false</source-location>
 +      </compilation-unit>
 +    </test-case>
 +  </test-group>
 +  <test-group name="window">
 +    <test-case FilePath="window">
 +      <compilation-unit name="cume_dist_01">
 +        <output-dir compare="Text">cume_dist_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="dense_rank_01">
 +        <output-dir compare="Text">dense_rank_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="first_value_01">
 +        <output-dir compare="Text">first_value_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="lag_01">
 +        <output-dir compare="Text">lag_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="last_value_01">
 +        <output-dir compare="Text">last_value_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="lead_01">
 +        <output-dir compare="Text">lead_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="misc_01">
 +        <output-dir compare="Text">misc_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="nth_value_01">
 +        <output-dir compare="Text">nth_value_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="ntile_01">
 +        <output-dir compare="Text">ntile_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="percent_rank_01">
 +        <output-dir compare="Text">percent_rank_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="pg_win">
 +        <output-dir compare="Text">pg_win</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="rank_01">
 +        <output-dir compare="Text">rank_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="ratio_to_report_01">
 +        <output-dir compare="Text">ratio_to_report_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="row_number_01">
 +        <output-dir compare="Text">row_number_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="win_negative">
 +        <output-dir compare="Text">misc_01</output-dir>
 +        <expected-error>ASX0002: Type mismatch</expected-error>
 +        <expected-error>ASX1104: Invalid modifier FROM FIRST/LAST for function</expected-error>
 +        <expected-error>ASX1037: Invalid query parameter compiler.windowmemory</expected-error>
 +        <expected-error>ASX1102: Expected window or aggregate function, got: unknown_func</expected-error>
 +        <expected-error>ASX1079: Compilation error: count is a SQL-92 aggregate function</expected-error>
 +        <expected-error>ASX1104: Invalid modifier RESPECT/IGNORE NULLS for function</expected-error>
 +        <expected-error>ASX1104: Invalid modifier RESPECT/IGNORE NULLS for function</expected-error>
 +        <expected-error>ASX1104: Invalid modifier FROM FIRST/LAST for function</expected-error>
 +        <source-location>false</source-location>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="win_null_missing">
 +        <output-dir compare="Text">win_null_missing</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="win_opt_01">
 +        <output-dir compare="Text">win_opt_01</output-dir>
 +      </compilation-unit>
 +    </test-case>
 +    <test-case FilePath="window">
 +      <compilation-unit name="win_opt_02">
 +        <output-dir compare="Text">win_opt_02</output-dir>
 +      </compilation-unit>
 +    </test-case>
    </test-group>
  </test-suite>
diff --cc asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index e52d604,8b3e12d..1ccea2a
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@@ -64,9 -64,9 +64,10 @@@ import org.apache.asterix.lang.sqlpp.re
  import org.apache.asterix.lang.sqlpp.rewrites.visitor.OperatorExpressionVisitor;
  import org.apache.asterix.lang.sqlpp.rewrites.visitor.SetOperationVisitor;
  import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppBuiltinFunctionRewriteVisitor;
+ import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppCaseRewriteVisitor;
  import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGroupByAggregationSugarVisitor;
  import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGroupByVisitor;
 +import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGroupingSetsVisitor;
  import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppInlineUdfsVisitor;
  import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppListInputFunctionRewriteVisitor;
  import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppWindowAggregationSugarVisitor;
diff --cc asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/AbstractSqlppExpressionExtractionVisitor.java
index fc2e25b,b132ea0..6b57089
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/AbstractSqlppExpressionExtractionVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/AbstractSqlppExpressionExtractionVisitor.java
@@@ -52,37 -57,64 +57,66 @@@ abstract class AbstractSqlppExpressionE
  
      @Override
      public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
 -        List<Pair<Expression, VarIdentifier>> extractionList = new ArrayList<>();
 -        stack.push(extractionList);
 +        StackElement stackElement = new StackElement(selectBlock);
 +        stack.push(stackElement);
  
          if (selectBlock.hasFromClause()) {
-             FromClause clause = selectBlock.getFromClause();
-             clause.accept(this, arg);
-             if (!stackElement.extractionList.isEmpty()) {
-                 handleUnsupportedClause(clause);
-             }
 -            visitFromClause(selectBlock.getFromClause(), arg, extractionList);
++            visitFromClause(selectBlock.getFromClause(), arg, stackElement);
          }
          List<AbstractClause> letWhereList = selectBlock.getLetWhereList();
          if (!letWhereList.isEmpty()) {
-             visitLetWhereClauses(letWhereList, stackElement.extractionList, arg);
 -            visitLetWhereClauses(letWhereList, arg, extractionList);
++            visitLetWhereClauses(letWhereList, arg, stackElement.extractionList);
          }
+         GroupbyClause groupbyClause = null;
          if (selectBlock.hasGroupbyClause()) {
-             selectBlock.getGroupbyClause().accept(this, arg);
-             introduceLetClauses(stackElement.extractionList, letWhereList);
+             groupbyClause = selectBlock.getGroupbyClause();
 -            visitGroupByClause(groupbyClause, arg, extractionList, letWhereList);
++            visitGroupByClause(groupbyClause, arg, stackElement.extractionList, letWhereList);
          }
          List<AbstractClause> letHavingListAfterGby = selectBlock.getLetHavingListAfterGroupby();
          if (!letHavingListAfterGby.isEmpty()) {
-             visitLetWhereClauses(letHavingListAfterGby, stackElement.extractionList, arg);
 -            visitLetHavingClausesAfterGby(arg, extractionList, letHavingListAfterGby, groupbyClause);
++            visitLetHavingClausesAfterGby(arg, stackElement.extractionList, letHavingListAfterGby, groupbyClause);
          }
-         selectBlock.getSelectClause().accept(this, arg);
-         introduceLetClauses(stackElement.extractionList,
-                 selectBlock.hasGroupbyClause() ? letHavingListAfterGby : letWhereList);
 -        visitSelectClause(selectBlock.getSelectClause(), arg, extractionList,
++        visitSelectClause(selectBlock.getSelectClause(), arg, stackElement.extractionList,
+                 selectBlock.hasGroupbyClause() ? letHavingListAfterGby : letWhereList, groupbyClause);
  
          stack.pop();
          return null;
      }
  
-     private void visitLetWhereClauses(List<AbstractClause> clauseList,
 -    protected void visitFromClause(FromClause clause, ILangExpression arg,
 -            List<Pair<Expression, VarIdentifier>> extractionList) throws CompilationException {
 -        // Skip extraction because we won't be able to perform it as there are no LET clauses yet.
 -        // Subclasses can override and fail if necessary
++    protected void visitFromClause(FromClause clause, ILangExpression arg, StackElement stackElement)
++            throws CompilationException {
++        clause.accept(this, arg);
++        if (!stackElement.extractionList.isEmpty()) {
++            handleUnsupportedClause(clause);
++        }
+     }
+ 
+     protected void visitLetWhereClauses(List<AbstractClause> letWhereList, ILangExpression arg,
+             List<Pair<Expression, VarIdentifier>> extractionList) throws CompilationException {
+         visitLetWhereClausesImpl(letWhereList, extractionList, arg);
+     }
+ 
+     protected void visitGroupByClause(GroupbyClause groupbyClause, ILangExpression arg,
+             List<Pair<Expression, VarIdentifier>> extractionList, List<AbstractClause> letWhereList)
+             throws CompilationException {
+         groupbyClause.accept(this, arg);
+         introduceLetClauses(extractionList, letWhereList);
+     }
+ 
+     protected void visitLetHavingClausesAfterGby(ILangExpression arg,
+             List<Pair<Expression, VarIdentifier>> extractionList, List<AbstractClause> letHavingListAfterGby,
+             GroupbyClause groupbyClause) throws CompilationException {
+         visitLetWhereClausesImpl(letHavingListAfterGby, extractionList, arg);
+     }
+ 
+     protected void visitSelectClause(SelectClause selectClause, ILangExpression arg,
+             List<Pair<Expression, VarIdentifier>> extractionList, List<AbstractClause> letWhereList,
+             GroupbyClause groupbyClause) throws CompilationException {
+         selectClause.accept(this, arg);
+         introduceLetClauses(extractionList, letWhereList);
+     }
+ 
+     private void visitLetWhereClausesImpl(List<AbstractClause> clauseList,
              List<Pair<Expression, VarIdentifier>> extractionList, ILangExpression arg) throws CompilationException {
          List<AbstractClause> newClauseList = new ArrayList<>(clauseList.size());
          for (AbstractClause letWhereClause : clauseList) {
@@@ -108,27 -140,32 +142,56 @@@
          fromBindingList.clear();
      }
  
+     protected List<Expression> extractExpressionsFromList(List<Expression> exprList, int limit,
+             Predicate<Expression> exprTest) {
 -        List<Pair<Expression, VarIdentifier>> outLetList = stack.peek();
 -        if (outLetList == null) {
++        StackElement outElement = stack.peek();
++        if (outElement == null) {
+             return null;
+         }
+         int n = exprList.size();
+         List<Expression> newExprList = new ArrayList<>(n);
+         for (int i = 0; i < n; i++) {
+             Expression expr = exprList.get(i);
 -            Expression newExpr = i < limit && exprTest.test(expr) ? extractExpressionImpl(expr, outLetList) : expr;
++            Expression newExpr = i < limit && exprTest.test(expr) ? extractExpressionImpl(expr, outElement) : expr;
+             newExprList.add(newExpr);
+         }
+         return newExprList;
+     }
+ 
+     protected Expression extractExpression(Expression expr) {
 -        List<Pair<Expression, VarIdentifier>> outLetList = stack.peek();
++        StackElement outLetList = stack.peek();
+         return outLetList != null ? extractExpressionImpl(expr, outLetList) : null;
+     }
+ 
 -    private VariableExpr extractExpressionImpl(Expression expr, List<Pair<Expression, VarIdentifier>> outLetList) {
++    private VariableExpr extractExpressionImpl(Expression expr, StackElement outElement) {
+         VarIdentifier v = context.newVariable();
+         VariableExpr vExpr = new VariableExpr(v);
+         vExpr.setSourceLocation(expr.getSourceLocation());
 -        outLetList.add(new Pair<>(expr, v));
++        outElement.extractionList.add(new Pair<>(expr, v));
+         return vExpr;
+     }
++
 +    abstract void handleUnsupportedClause(FromClause clause) throws CompilationException;
 +
 +    protected final class StackElement {
 +
 +        private final SelectBlock selectBlock;
 +
-         private final List<Pair<Expression, VarIdentifier>> extractionList;
++        protected final List<Pair<Expression, VarIdentifier>> extractionList;
 +
 +        private StackElement(SelectBlock selectBlock) {
 +            this.selectBlock = selectBlock;
 +            this.extractionList = new ArrayList<>();
 +        }
 +
 +        public SelectBlock getSelectBlock() {
 +            return selectBlock;
 +        }
 +
 +        public VarIdentifier addPendingLetClause(Expression expression) {
 +            VarIdentifier letVar = context.newVariable();
 +            extractionList.add(new Pair<>(expression, letVar));
 +            return letVar;
 +        }
 +    }
  }
diff --cc asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppCaseRewriteVisitor.java
index 0000000,5752aef..24a9c1f
mode 000000,100644..100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppCaseRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppCaseRewriteVisitor.java
@@@ -1,0 -1,95 +1,104 @@@
+ /*
+  * 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.asterix.lang.sqlpp.rewrites.visitor;
+ 
+ import java.util.List;
+ 
+ import org.apache.asterix.common.exceptions.CompilationException;
++import org.apache.asterix.common.exceptions.ErrorCode;
+ import org.apache.asterix.lang.common.base.AbstractClause;
+ import org.apache.asterix.lang.common.base.Expression;
+ import org.apache.asterix.lang.common.base.ILangExpression;
+ import org.apache.asterix.lang.common.clause.GroupbyClause;
+ import org.apache.asterix.lang.common.expression.CallExpr;
+ import org.apache.asterix.lang.common.expression.IfExpr;
+ import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+ import org.apache.asterix.lang.common.struct.VarIdentifier;
++import org.apache.asterix.lang.sqlpp.clause.FromClause;
+ import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
+ import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+ import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
+ import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor;
++import org.apache.asterix.om.functions.BuiltinFunctions;
+ import org.apache.hyracks.algebricks.common.utils.Pair;
+ 
+ /**
+  * Extracts SQL-92 aggregate functions from CASE/IF expressions into LET clauses,
+  * so they can be pushed into GROUPBY subplans by the optimizer.
+  */
+ public final class SqlppCaseRewriteVisitor extends AbstractSqlppExpressionExtractionVisitor {
+ 
+     public SqlppCaseRewriteVisitor(LangRewritingContext context) {
+         super(context);
+     }
+ 
+     @Override
+     protected void visitLetWhereClauses(List<AbstractClause> letWhereList, ILangExpression arg,
+             List<Pair<Expression, VarIdentifier>> extractionList) {
+         // do not perform the extraction
+     }
+ 
+     @Override
+     protected void visitGroupByClause(GroupbyClause groupbyClause, ILangExpression arg,
+             List<Pair<Expression, VarIdentifier>> extractionList, List<AbstractClause> letWhereList) {
+         // do not perform the extraction
+     }
+ 
+     @Override
+     public Expression visit(CaseExpression caseExpr, ILangExpression arg) throws CompilationException {
+         Expression resultExpr = super.visit(caseExpr, arg);
+         resultExpr.accept(new Sql92AggregateExtractionVisitor(), arg);
+         return resultExpr;
+     }
+ 
+     @Override
+     public Expression visit(IfExpr ifExpr, ILangExpression arg) throws CompilationException {
+         Expression resultExpr = super.visit(ifExpr, arg);
+         resultExpr.accept(new Sql92AggregateExtractionVisitor(), arg);
+         return resultExpr;
+     }
+ 
++    @Override
++    void handleUnsupportedClause(FromClause clause) throws CompilationException {
++        throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_USE_OF_IDENTIFIER, clause.getSourceLocation(),
++                BuiltinFunctions.SWITCH_CASE.getName());
++    }
++
+     private final class Sql92AggregateExtractionVisitor extends AbstractSqlppSimpleExpressionVisitor {
+ 
+         @Override
+         public Expression visit(CallExpr callExpr, ILangExpression arg) throws CompilationException {
+             CallExpr resultExpr = (CallExpr) super.visit(callExpr, arg);
+             if (FunctionMapUtil.isSql92AggregateFunction(resultExpr.getFunctionSignature())) {
+                 Expression newExpr = extractExpression(resultExpr);
+                 if (newExpr != null) {
+                     return newExpr;
+                 }
+             }
+             return resultExpr;
+         }
+ 
+         @Override
+         public Expression visit(SelectExpression selectExpression, ILangExpression arg) {
+             // don't visit sub-queries
+             return selectExpression;
+         }
+     }
+ }
diff --cc asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppWindowRewriteVisitor.java
index 5c20bec,9167ce8..cbc3ac9
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppWindowRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppWindowRewriteVisitor.java
@@@ -53,6 -53,16 +53,16 @@@ public final class SqlppWindowRewriteVi
      }
  
      @Override
 -    protected void visitFromClause(FromClause clause, ILangExpression arg,
 -            List<Pair<Expression, VarIdentifier>> extractionList) throws CompilationException {
++    protected void visitFromClause(FromClause clause, ILangExpression arg, StackElement stackElement)
++            throws CompilationException {
+         clause.accept(this, arg);
 -        if (!extractionList.isEmpty()) {
++        if (!stackElement.extractionList.isEmpty()) {
+             throw new CompilationException(ErrorCode.COMPILATION_UNEXPECTED_WINDOW_EXPRESSION,
+                     clause.getSourceLocation());
+         }
+     }
+ 
+     @Override
      public Expression visit(WindowExpression winExpr, ILangExpression arg) throws CompilationException {
          super.visit(winExpr, arg);
  
@@@ -88,30 -100,7 +100,30 @@@
          return winExpr;
      }
  
 +    private List<Expression> extractExpressions(List<Expression> exprList, int limit) {
 +        StackElement stackElement = stack.peek();
 +        if (stackElement == null) {
 +            return null;
 +        }
 +        int n = exprList.size();
 +        List<Expression> newExprList = new ArrayList<>(n);
 +        for (int i = 0; i < n; i++) {
 +            Expression expr = exprList.get(i);
 +            Expression newExpr;
 +            if (i < limit && isExtractableExpression(expr)) {
 +                VarIdentifier v = stackElement.addPendingLetClause(expr);
 +                VariableExpr vExpr = new VariableExpr(v);
 +                vExpr.setSourceLocation(expr.getSourceLocation());
 +                newExpr = vExpr;
 +            } else {
 +                newExpr = expr;
 +            }
 +            newExprList.add(newExpr);
 +        }
 +        return newExprList;
 +    }
 +
-     private boolean isExtractableExpression(Expression expr) {
+     protected static boolean isExtractableExpression(Expression expr) {
          switch (expr.getKind()) {
              case LITERAL_EXPRESSION:
              case VARIABLE_EXPRESSION:
diff --cc asterixdb/asterix-server/pom.xml
index b794d73,2f367aa..0db37fc
--- a/asterixdb/asterix-server/pom.xml
+++ b/asterixdb/asterix-server/pom.xml
@@@ -178,9 -178,29 +178,33 @@@
                <url>https://raw.githubusercontent.com/reactive-streams/reactive-streams-jvm/v1.0.2/LICENSE.txt</url>
              </override>
              <override>
+               <gavs>
+                 <gav>software.amazon.awssdk:sdk-core:2.10.83</gav>
+                 <gav>software.amazon.awssdk:aws-core:2.10.83</gav>
+                 <gav>software.amazon.awssdk:auth:2.10.83</gav>
+                 <gav>software.amazon.awssdk:arns:2.10.83</gav>
+                 <gav>software.amazon.awssdk:annotations:2.10.83</gav>
+                 <gav>software.amazon.awssdk:utils:2.10.83</gav>
+                 <gav>software.amazon.awssdk:aws-query-protocol:2.10.83</gav>
+                 <gav>software.amazon.awssdk:profiles:2.10.83</gav>
+                 <gav>software.amazon.awssdk:protocol-core:2.10.83</gav>
+                 <gav>software.amazon.awssdk:s3:2.10.83</gav>
+                 <gav>software.amazon.awssdk:netty-nio-client:2.10.83</gav>
+                 <gav>software.amazon.awssdk:apache-client:2.10.83</gav>
+                 <gav>software.amazon.awssdk:aws-xml-protocol:2.10.83</gav>
+                 <gav>software.amazon.awssdk:regions:2.10.83</gav>
+                 <gav>software.amazon.awssdk:http-client-spi:2.10.83</gav>
+               </gavs>
+               <noticeUrl>https://raw.githubusercontent.com/aws/aws-sdk-java-v2/2.10.83/NOTICE.txt</noticeUrl>
+             </override>
+             <override>
+               <gav>software.amazon.eventstream:eventstream:1.0.1</gav>
+               <noticeUrl>https://raw.githubusercontent.com/awslabs/aws-eventstream-java/7be2dd80e12f8835674c8ffb0f4a2efb64c7b585/NOTICE</noticeUrl>
+             </override>
++            <override>
 +              <gav>org.mindrot:jbcrypt:0.4</gav>
 +              <url>http://www.mindrot.org/files/jBCrypt/LICENSE</url>
 +            </override>
            </overrides>
            <licenses>
              <license>
diff --cc asterixdb/pom.xml
index ece4b12,cd5e060..bb3a018
--- a/asterixdb/pom.xml
+++ b/asterixdb/pom.xml
@@@ -615,32 -655,6 +654,19 @@@
        </properties>
      </profile>
      <profile>
-       <id>skip-dashboard</id>
-       <activation>
-         <property>
-           <name>skip.npm</name>
-           <value>true</value>
-         </property>
-       </activation>
-       <properties>
-         <license.stage>none</license.stage>
-         <resource.stage>none</resource.stage>
-       </properties>
-     </profile>
-     <profile>
 +      <id>python-udfs</id>
 +      <activation>
 +        <file>
 +          <exists>${python.path}</exists>
 +        </file>
 +      </activation>
 +      <properties>
 +        <pyro-shim.stage>process-classes</pyro-shim.stage>
 +        <pytestlib.stage>generate-test-resources</pytestlib.stage>
 +        <global.itest.excludes/>
 +      </properties>
 +    </profile>
 +    <profile>
        <id>invalid-tests</id>
        <properties>
          <invalid.tests />
diff --cc asterixdb/src/main/appended-resources/supplemental-models.xml
index 2d74604,0bb23f0..060ce3a
--- a/asterixdb/src/main/appended-resources/supplemental-models.xml
+++ b/asterixdb/src/main/appended-resources/supplemental-models.xml
@@@ -271,16 -271,231 +271,243 @@@
        </properties>
      </project>
    </supplement>
+ 
+   <!-- AWS SDK begin -->
+   <!-- software.amazon.awssdk is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
+   <!-- license override not needed, ALv2 is specified in its pom.xml -->
+   <!-- see https://github.com/aws/aws-sdk-java-v2/blob/master/LICENSE.txt -->
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>sdk-core</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>aws-core</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>s3</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>auth</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>protocol-core</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>regions</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>arns</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>netty-nio-client</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>aws-xml-protocol</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>annotations</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>apache-client</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>utils</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>http-client-spi</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>aws-query-protocol</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <supplement>
+     <project>
+       <groupId>software.amazon.awssdk</groupId>
+       <artifactId>profiles</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.10.83</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.10.83</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>2.10.83</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+ 
+   <!-- software.amazon.eventstream is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
+   <!-- license override not needed, ALv2 is specified in its pom.xml -->
+   <!-- see https://github.com/awslabs/aws-eventstream-java -->
+   <supplement>
+     <project>
+       <groupId>software.amazon.eventstream</groupId>
+       <artifactId>eventstream</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>1.0.1</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>1.0.1</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreNoticeOverride>1.0.1</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+   <!-- AWS SDK end -->
+ 
+   <!-- com.typesafe.netty is ALv2, and does not contain any embedded LICENSE or NOTICE file -->
+   <!-- license override not needed, ALv2 is specified in its pom.xml -->
+   <!-- see https://github.com/playframework/netty-reactive-streams -->
+   <supplement>
+     <project>
+       <groupId>com.typesafe.netty</groupId>
+       <artifactId>netty-reactive-streams</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.0.4</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.0.4</license.ignoreMissingEmbeddedNotice>
+       </properties>
+     </project>
+   </supplement>
+ 
+   <supplement>
+     <project>
+       <groupId>com.typesafe.netty</groupId>
+       <artifactId>netty-reactive-streams-http</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>2.0.4</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>2.0.4</license.ignoreMissingEmbeddedNotice>
+       </properties>
+     </project>
+   </supplement>
+ 
+   <!-- org.reactivestreams does not contain any embedded LICENSE or NOTICE file -->
+   <!-- see https://github.com/reactive-streams/reactive-streams-jvm -->
+   <supplement>
+     <project>
+       <groupId>org.reactivestreams</groupId>
+       <artifactId>reactive-streams</artifactId>
+       <properties>
+         <license.ignoreMissingEmbeddedLicense>1.0.2</license.ignoreMissingEmbeddedLicense>
+         <license.ignoreMissingEmbeddedNotice>1.0.2</license.ignoreMissingEmbeddedNotice>
+         <license.ignoreLicenseOverride>1.0.2</license.ignoreLicenseOverride>
+         <license.ignoreNoticeOverride>1.0.2</license.ignoreNoticeOverride>
+       </properties>
+     </project>
+   </supplement>
+ 
 +  <supplement>
 +    <project>
 +      <groupId>org.mindrot</groupId>
 +      <artifactId>jbcrypt</artifactId>
 +      <licenses>
 +        <license>
 +          <name>ISC License</name>
 +          <url>http://www.mindrot.org/files/jBCrypt/LICENSE</url>
 +        </license>
 +      </licenses>
 +    </project>
 +  </supplement>
  </supplementalDataModels>