limitations.asciidoc 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. [role="xpack"]
  2. [testenv="basic"]
  3. [[sql-limitations]]
  4. == SQL Limitations
  5. [float]
  6. [[large-parsing-trees]]
  7. === Large queries may throw `ParsingExpection`
  8. Extremely large queries can consume too much memory during the parsing phase, in which case the {es-sql} engine will
  9. abort parsing and throw an error. In such cases, consider reducing the query to a smaller size by potentially
  10. simplifying it or splitting it into smaller queries.
  11. [float]
  12. [[sys-columns-describe-table-nested-fields]]
  13. === Nested fields in `SYS COLUMNS` and `DESCRIBE TABLE`
  14. {es} has a special type of relationship fields called `nested` fields. In {es-sql} they can be used by referencing their inner
  15. sub-fields. Even though `SYS COLUMNS` in non-driver mode (in the CLI and in REST calls) and `DESCRIBE TABLE` will still display
  16. them as having the type `NESTED`, they cannot be used in a query. One can only reference its sub-fields in the form:
  17. [source, sql]
  18. --------------------------------------------------
  19. [nested_field_name].[sub_field_name]
  20. --------------------------------------------------
  21. For example:
  22. [source, sql]
  23. --------------------------------------------------
  24. SELECT dep.dep_name.keyword FROM test_emp GROUP BY languages;
  25. --------------------------------------------------
  26. [float]
  27. === Multi-nested fields
  28. {es-sql} doesn't support multi-nested documents, so a query cannot reference more than one nested field in an index.
  29. This applies to multi-level nested fields, but also multiple nested fields defined on the same level. For example, for this index:
  30. [source, sql]
  31. ----------------------------------------------------
  32. column | type | mapping
  33. ----------------------+---------------+-------------
  34. nested_A |STRUCT |NESTED
  35. nested_A.nested_X |STRUCT |NESTED
  36. nested_A.nested_X.text|VARCHAR |KEYWORD
  37. nested_A.text |VARCHAR |KEYWORD
  38. nested_B |STRUCT |NESTED
  39. nested_B.text |VARCHAR |KEYWORD
  40. ----------------------------------------------------
  41. `nested_A` and `nested_B` cannot be used at the same time, nor `nested_A`/`nested_B` and `nested_A.nested_X` combination.
  42. For such situations, {es-sql} will display an error message.
  43. [float]
  44. === Paginating nested inner hits
  45. When SELECTing a nested field, pagination will not work as expected, {es-sql} will return __at least__ the page size records.
  46. This is because of the way nested queries work in {es}: the root nested field will be returned and it's matching inner nested fields as well,
  47. pagination taking place on the **root nested document and not on its inner hits**.
  48. [float]
  49. [[normalized-keyword-fields]]
  50. === Normalized `keyword` fields
  51. `keyword` fields in {es} can be normalized by defining a `normalizer`. Such fields are not supported in {es-sql}.
  52. [float]
  53. === Array type of fields
  54. Array fields are not supported due to the "invisible" way in which {es} handles an array of values: the mapping doesn't indicate whether
  55. a field is an array (has multiple values) or not, so without reading all the data, {es-sql} cannot know whether a field is a single or multi value.
  56. When multiple values are returned for a field, by default, {es-sql} will throw an exception. However, it is possible to change this behavior through `field_multi_value_leniency` parameter in REST (disabled by default) or
  57. `field.multi.value.leniency` in drivers (enabled by default).
  58. [float]
  59. === Sorting by aggregation
  60. When doing aggregations (`GROUP BY`) {es-sql} relies on {es}'s `composite` aggregation for its support for paginating results.
  61. However this type of aggregation does come with a limitation: sorting can only be applied on the key used for the aggregation's buckets.
  62. {es-sql} overcomes this limitation by doing client-side sorting however as a safety measure, allows only up to *512* rows.
  63. It is recommended to use `LIMIT` for queries that use sorting by aggregation, essentially indicating the top N results that are desired:
  64. [source, sql]
  65. --------------------------------------------------
  66. SELECT * FROM test GROUP BY age ORDER BY COUNT(*) LIMIT 100;
  67. --------------------------------------------------
  68. It is possible to run the same queries without a `LIMIT` however in that case if the maximum size (*512*) is passed, an exception will be
  69. returned as {es-sql} is unable to track (and sort) all the results returned.
  70. [float]
  71. === Using aggregation functions on top of scalar functions
  72. Aggregation functions like <<sql-functions-aggs-min,`MIN`>>, <<sql-functions-aggs-max,`MAX`>>, etc. can only be used
  73. directly on fields, and so queries like `SELECT MAX(abs(age)) FROM test` are not possible.
  74. [float]
  75. === Using a sub-select
  76. Using sub-selects (`SELECT X FROM (SELECT Y)`) is **supported to a small degree**: any sub-select that can be "flattened" into a single
  77. `SELECT` is possible with {es-sql}. For example:
  78. ["source","sql",subs="attributes,macros"]
  79. --------------------------------------------------
  80. include-tagged::{sql-specs}/docs/docs.csv-spec[limitationSubSelect]
  81. --------------------------------------------------
  82. The query above is possible because it is equivalent with:
  83. ["source","sql",subs="attributes,macros"]
  84. --------------------------------------------------
  85. include-tagged::{sql-specs}/docs/docs.csv-spec[limitationSubSelectRewritten]
  86. --------------------------------------------------
  87. But, if the sub-select would include a `GROUP BY` or `HAVING` or the enclosing `SELECT` would be more complex than `SELECT X
  88. FROM (SELECT ...) WHERE [simple_condition]`, this is currently **un-supported**.
  89. [float]
  90. [[first-last-agg-functions-having-clause]]
  91. === Using <<sql-functions-aggs-first, `FIRST`>>/<<sql-functions-aggs-last,`LAST`>> aggregation functions in `HAVING` clause
  92. Using `FIRST` and `LAST` in the `HAVING` clause is not supported. The same applies to
  93. <<sql-functions-aggs-min,`MIN`>> and <<sql-functions-aggs-max,`MAX`>> when their target column
  94. is of type <<keyword, `keyword`>> as they are internally translated to `FIRST` and `LAST`.
  95. [float]
  96. [[group-by-time]]
  97. === Using TIME data type in GROUP BY or <<sql-functions-grouping-histogram>>
  98. Using `TIME` data type as a grouping key is currently not supported. For example:
  99. [source, sql]
  100. -------------------------------------------------------------
  101. SELECT count(*) FROM test GROUP BY CAST(date_created AS TIME);
  102. -------------------------------------------------------------
  103. On the other hand, it can still be used if it's wrapped with a scalar function that returns another data type,
  104. for example:
  105. [source, sql]
  106. -------------------------------------------------------------
  107. SELECT count(*) FROM test GROUP BY MINUTE((CAST(date_created AS TIME));
  108. -------------------------------------------------------------
  109. `TIME` data type is also currently not supported in histogram grouping function. For example:
  110. [source, sql]
  111. -------------------------------------------------------------
  112. SELECT HISTOGRAM(CAST(birth_date AS TIME), INTERVAL '10' MINUTES) as h, COUNT(*) FROM t GROUP BY h
  113. -------------------------------------------------------------
  114. [float]
  115. [[geo-sql-limitations]]
  116. === Geo-related functions
  117. Since `geo_shape` fields don't have doc values these fields cannot be used for filtering, grouping or sorting.
  118. By default,`geo_points` fields are indexed and have doc values. However only latitude and longitude are stored and
  119. indexed with some loss of precision from the original values (4.190951585769653E-8 for the latitude and
  120. 8.381903171539307E-8 for longitude). The altitude component is accepted but not stored in doc values nor indexed.
  121. Therefore calling `ST_Z` function in the filtering, grouping or sorting will return `null`.