[FEAT MERGE]JSON_TABLE EXPR Implement IN MySQL Mode && dbms lob implement

Co-authored-by: skylhd <dickylhd@gmail.com>
This commit is contained in:
obdev
2023-08-29 05:18:37 +00:00
committed by ob-robot
parent a8e5c8a999
commit 0697e7f776
27 changed files with 1839 additions and 537 deletions

View File

@ -340,7 +340,6 @@ int ObDMLStmtPrinter::print_table(const TableItem *table_item,
break;
}
case TableItem::JSON_TABLE: {
CK (lib::is_oracle_mode());
DATA_PRINTF("JSON_TABLE(");
OZ (expr_printer_.do_print(table_item->json_table_def_->doc_expr_, T_FROM_SCOPE));
OZ (print_json_table(table_item));
@ -372,93 +371,480 @@ int ObDMLStmtPrinter::print_table(const TableItem *table_item,
}
int ObDMLStmtPrinter::print_json_return_type(int64_t value, ObDataType data_type)
{
int ret = OB_SUCCESS;
if (lib::is_mysql_mode()) {
if (OB_FAIL(print_mysql_json_return_type(value, data_type))) {
LOG_WARN("fail to print json table column in mysql mode", K(ret));
}
} else {
ParseNode parse_node;
parse_node.value_ = value;
int16_t cast_type = parse_node.int16_values_[OB_NODE_CAST_TYPE_IDX];
const ObLengthSemantics length_semantics = data_type.get_length_semantics();
const ObScale scale = data_type.get_scale();
switch (cast_type) {
case T_CHAR: {
int16_t collation = parse_node.int16_values_[OB_NODE_CAST_COLL_IDX];
int32_t len = parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX];
DATA_PRINTF("char(%d %s)", len, get_length_semantics_str(length_semantics));
break;
}
case T_VARCHAR: {
int16_t collation = parse_node.int16_values_[OB_NODE_CAST_COLL_IDX];
int32_t len = parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX];
const int32_t DEFAULT_VARCHAR_LEN = 4000;
if (BINARY_COLLATION == collation) {
DATA_PRINTF("varbinary(%d)", len);
} else {
// CHARACTER
if (len == DEFAULT_VARCHAR_LEN) {
break;
} else if (length_semantics == LS_BYTE && len == -1) {
DATA_PRINTF(" VARCHAR2");
break;
} else {
DATA_PRINTF("varchar2(%d %s)", len, get_length_semantics_str(length_semantics));
}
}
break;
}
case T_NVARCHAR2: {
DATA_PRINTF("nvarchar2(%d)", parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX]);
break;
}
case T_NCHAR: {
DATA_PRINTF("nchar(%d)", parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX]);
break;
}
case T_DATETIME: {
//oracle mode treate date as datetime
DATA_PRINTF("date");
break;
}
case T_DATE: {
DATA_PRINTF("date");
break;
}
case T_TIME: {
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
if (scale >= 0) {
DATA_PRINTF("time(%d)", scale);
} else {
DATA_PRINTF("time");
}
break;
}
case T_NUMBER: {
int16_t precision = parse_node.int16_values_[OB_NODE_CAST_N_PREC_IDX];
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
DATA_PRINTF("number(%d,%d)", precision, scale);
break;
}
case T_NUMBER_FLOAT: {
int16_t precision = parse_node.int16_values_[OB_NODE_CAST_N_PREC_IDX];
DATA_PRINTF("float(%d)", precision);
break;
}
case T_TINYINT:
case T_SMALLINT:
case T_MEDIUMINT:
case T_INT32:
case T_INT: {
DATA_PRINTF("signed");
break;
}
case T_UTINYINT:
case T_USMALLINT:
case T_UMEDIUMINT:
case T_UINT32:
case T_UINT64: {
DATA_PRINTF("unsigned");
break;
}
case T_INTERVAL_YM: {
int year_scale = ObIntervalScaleUtil::ob_scale_to_interval_ym_year_scale(static_cast<int8_t>(scale));
DATA_PRINTF("interval year(%d) to month", year_scale);
break;
}
case T_INTERVAL_DS: {
int day_scale = ObIntervalScaleUtil::ob_scale_to_interval_ds_day_scale(static_cast<int8_t>(scale));
int fs_scale = ObIntervalScaleUtil::ob_scale_to_interval_ds_second_scale(static_cast<int8_t>(scale));
DATA_PRINTF("interval day(%d) to second(%d)", day_scale, fs_scale);
break;
}
case T_TIMESTAMP_TZ: {
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
if (scale >= 0) {
DATA_PRINTF("timestamp(%d) with time zone", scale);
} else {
DATA_PRINTF("timestamp with time zone");
}
break;
}
case T_TIMESTAMP_LTZ: {
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
if (scale >= 0) {
DATA_PRINTF("timestamp(%d) with local time zone", scale);
} else {
DATA_PRINTF("timestamp with local time zone");
}
break;
}
case T_TIMESTAMP_NANO: {
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
if (scale >= 0) {
DATA_PRINTF("timestamp(%d)", scale);
} else {
DATA_PRINTF("timestamp");
}
break;
}
case T_RAW: {
int32_t len = parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX];
DATA_PRINTF("raw(%d)", len);
break;
}
case T_FLOAT: {
const char *type_str = lib::is_oracle_mode() ? "binary_float" : "float";
DATA_PRINTF("%s", type_str);
break;
}
case T_DOUBLE: {
const char *type_str = lib::is_oracle_mode() ? "binary_double" : "double";
DATA_PRINTF("%s", type_str);
break;
}
case T_UROWID: {
DATA_PRINTF("urowid(%d)", parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX]);
break;
}
case T_LOB: {
int16_t collation = parse_node.int16_values_[OB_NODE_CAST_COLL_IDX];
if (BINARY_COLLATION == collation) {
DATA_PRINTF("blob");
} else {
DATA_PRINTF("clob");
}
break;
}
case T_JSON: {
DATA_PRINTF("json");
break;
}
case T_LONGTEXT: {
int16_t collation = parse_node.int16_values_[OB_NODE_CAST_COLL_IDX];
if (BINARY_COLLATION == collation) {
DATA_PRINTF("blob");
} else {
DATA_PRINTF("clob");
}
break;
}
default: {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unknown cast type", K(ret), K(cast_type));
break;
}
} // end switch
} // oracle mode
return ret;
}
int ObDMLStmtPrinter::print_binary_charset_collation(int64_t value, ObDataType data_type)
{
INIT_SUCC(ret);
if (data_type.is_binary_collation()) {
DATA_PRINTF("binary ");
}
if (CHARSET_INVALID != data_type.get_charset_type()) {
DATA_PRINTF("CHARACTER SET %s ", ObCharset::charset_name(data_type.get_charset_type()));
}
if (CS_TYPE_INVALID != data_type.get_collation_type()) {
DATA_PRINTF("COLLATE %s ", ObCharset::collation_name(data_type.get_collation_type()));
}
return ret;
}
int ObDMLStmtPrinter::print_mysql_json_return_type(int64_t value, ObDataType data_type)
{
int ret = OB_SUCCESS;
ParseNode parse_node;
parse_node.value_ = value;
int16_t cast_type = parse_node.int16_values_[OB_NODE_CAST_TYPE_IDX];
int16_t cast_type = data_type.get_obj_type();
const ObLengthSemantics length_semantics = data_type.get_length_semantics();
const ObScale scale = data_type.get_scale();
switch (cast_type) {
case T_CHAR: {
int16_t collation = parse_node.int16_values_[OB_NODE_CAST_COLL_IDX];
int32_t len = parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX];
DATA_PRINTF("char(%d %s)", len, get_length_semantics_str(length_semantics));
break;
}
case T_VARCHAR: {
int16_t collation = parse_node.int16_values_[OB_NODE_CAST_COLL_IDX];
int32_t len = parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX];
const int32_t DEFAULT_VARCHAR_LEN = 4000;
if (BINARY_COLLATION == collation) {
DATA_PRINTF("varbinary(%d)", len);
int32_t len = parse_node.int32_values_[0];
int32_t collation = parse_node.int32_values_[1];
if (1 == collation) {
DATA_PRINTF("binary(%d)", len);
} else {
// CHARACTER
if (len == DEFAULT_VARCHAR_LEN) {
break;
} else if (length_semantics == LS_BYTE && len == -1) {
DATA_PRINTF(" VARCHAR2");
break;
} else {
DATA_PRINTF("varchar2(%d %s)", len, get_length_semantics_str(length_semantics));
DATA_PRINTF("char(%d) ", len);
if (OB_FAIL(ret)) {
} else if (OB_FAIL(print_binary_charset_collation(value, data_type))) {
LOG_WARN("fail to print binary,charset,collection clause", K(ret));
}
}
break;
}
case T_NVARCHAR2: {
DATA_PRINTF("nvarchar2(%d)", parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX]);
break;
}
case T_NCHAR: {
DATA_PRINTF("nchar(%d)", parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX]);
break;
}
case T_DATETIME: {
//oracle mode treate date as datetime
DATA_PRINTF("date");
break;
}
case T_DATE: {
DATA_PRINTF("date");
break;
}
case T_TIME: {
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
if (scale >= 0) {
DATA_PRINTF("time(%d)", scale);
case T_VARCHAR: {
int32_t collation = parse_node.int32_values_[1];
int32_t len = parse_node.int32_values_[0];
const int32_t DEFAULT_VARCHAR_LEN = 4000;
if (1 == collation) {
DATA_PRINTF("varbinary(%d) ", len);
} else {
DATA_PRINTF("time");
DATA_PRINTF("varchar(%d) ", len);
if (OB_SUCC(ret) && OB_FAIL(print_binary_charset_collation(value, data_type))) {
LOG_WARN("fail to print binary,charset,collection clause", K(ret));
}
}
break;
}
case T_NUMBER: {
case T_BIT: {
int32_t len = parse_node.int16_values_[0];
DATA_PRINTF("bit(%d) ", len);
break;
}
case T_TINYTEXT: {
int16_t collation = parse_node.int32_values_[1];
if (1 == collation) {
DATA_PRINTF("TINYBLOB ");
} else {
DATA_PRINTF("TINYTEXT ");
}
if (OB_SUCC(ret) && !collation && OB_FAIL(print_binary_charset_collation(value, data_type))) {
LOG_WARN("fail to print binary,charset,collection clause", K(ret));
}
break;
}
case T_TEXT: {
int16_t collation = parse_node.int32_values_[1];
if (1 == collation) {
DATA_PRINTF("BLOB ");
} else {
DATA_PRINTF("TEXT ");
}
if (OB_SUCC(ret) && !collation && OB_FAIL(print_binary_charset_collation(value, data_type))) {
LOG_WARN("fail to print binary,charset,collection clause", K(ret));
}
break;
}
case T_MEDIUMTEXT: {
int16_t collation = parse_node.int32_values_[1];
if (1 == collation) {
DATA_PRINTF("MEDIUMBLOB ");
} else {
DATA_PRINTF("MEDIUMTEXT ");
}
if (OB_SUCC(ret) && !collation && OB_FAIL(print_binary_charset_collation(value, data_type))) {
LOG_WARN("fail to print binary,charset,collection clause", K(ret));
}
break;
}
case T_LONGTEXT: {
int16_t collation = parse_node.int32_values_[1];
if (1 == collation) {
DATA_PRINTF("LONGBLOB ");
} else {
DATA_PRINTF("LONGTEXT ");
}
if (OB_SUCC(ret) && !collation && OB_FAIL(print_binary_charset_collation(value, data_type))) {
LOG_WARN("fail to print binary,charset,collection clause", K(ret));
}
break;
}
case T_DATETIME: {
int16_t scale = parse_node.int16_values_[1];
if (scale >= 0) {
DATA_PRINTF("datetime(%d) ", scale);
} else {
DATA_PRINTF("datetime ");
}
break;
}
case T_DATE: {
DATA_PRINTF("date ");
break;
}
case T_YEAR: {
DATA_PRINTF("year ");
break;
}
case T_TIMESTAMP: {
int16_t scale = parse_node.int16_values_[1];
if (scale >= 0) {
DATA_PRINTF("timestamp(%d) ", scale);
} else {
DATA_PRINTF("timestamp ");
}
break;
}
case T_TIME: {
int16_t scale = parse_node.int16_values_[1];
if (scale >= 0) {
DATA_PRINTF("time(%d) ", scale);
} else {
DATA_PRINTF("time ");
}
break;
}
case T_NUMBER: { // number, decimal, fixed, numeric
int16_t precision = parse_node.int16_values_[OB_NODE_CAST_N_PREC_IDX];
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
DATA_PRINTF("number(%d,%d)", precision, scale);
DATA_PRINTF("DECIMAL(%d,%d) ", precision, scale);
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[3]) {
DATA_PRINTF("UNSIGNED ");
} else {
DATA_PRINTF("SIGNED ");
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_NUMBER_FLOAT: {
int16_t precision = parse_node.int16_values_[OB_NODE_CAST_N_PREC_IDX];
DATA_PRINTF("float(%d)", precision);
case T_TINYINT: {
if (parse_node.int16_values_[OB_NODE_CAST_COLL_IDX] == 1) {
DATA_PRINTF("BOOL ");
} else if (parse_node.int16_values_[OB_NODE_CAST_COLL_IDX] == 2) {
DATA_PRINTF("BOOLEAN ");
} else {
DATA_PRINTF("TINYINT ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_SMALLINT: {
DATA_PRINTF("SMALLINT ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_MEDIUMINT: {
DATA_PRINTF("MEDIUMINT ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_INT32: {
DATA_PRINTF("INTEGER ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_TINYINT:
case T_SMALLINT:
case T_MEDIUMINT:
case T_INT32:
case T_INT: {
DATA_PRINTF("signed");
DATA_PRINTF("BIGINT ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_UTINYINT: {
DATA_PRINTF("TINYINT ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[3]) {
DATA_PRINTF("UNSIGNED ");
} else {
DATA_PRINTF("SIGNED ");
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_USMALLINT:{
DATA_PRINTF("SMALLINT ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[3]) {
DATA_PRINTF("UNSIGNED ");
} else {
DATA_PRINTF("SIGNED ");
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_UMEDIUMINT:{
DATA_PRINTF("MEDIUMINT ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[3]) {
DATA_PRINTF("UNSIGNED ");
} else {
DATA_PRINTF("SIGNED ");
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_UINT32: {
DATA_PRINTF("INTEGER ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[3]) {
DATA_PRINTF("UNSIGNED ");
} else {
DATA_PRINTF("SIGNED ");
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_UTINYINT:
case T_USMALLINT:
case T_UMEDIUMINT:
case T_UINT32:
case T_UINT64: {
DATA_PRINTF("unsigned");
DATA_PRINTF("BIGINT ");
if (OB_SUCC(ret) && parse_node.int16_values_[0] != -1){
DATA_PRINTF("(%d)", parse_node.int16_values_[0]);
}
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[3]) {
DATA_PRINTF("UNSIGNED ");
} else {
DATA_PRINTF("SIGNED ");
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_INTERVAL_YM: {
@ -472,71 +858,64 @@ int ObDMLStmtPrinter::print_json_return_type(int64_t value, ObDataType data_type
DATA_PRINTF("interval day(%d) to second(%d)", day_scale, fs_scale);
break;
}
case T_TIMESTAMP_TZ: {
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
if (scale >= 0) {
DATA_PRINTF("timestamp(%d) with time zone", scale);
} else {
DATA_PRINTF("timestamp with time zone");
}
break;
}
case T_TIMESTAMP_LTZ: {
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
if (scale >= 0) {
DATA_PRINTF("timestamp(%d) with local time zone", scale);
} else {
DATA_PRINTF("timestamp with local time zone");
}
break;
}
case T_TIMESTAMP_NANO: {
int16_t scale = parse_node.int16_values_[OB_NODE_CAST_N_SCALE_IDX];
if (scale >= 0) {
DATA_PRINTF("timestamp(%d)", scale);
} else {
DATA_PRINTF("timestamp");
}
break;
}
case T_RAW: {
int32_t len = parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX];
DATA_PRINTF("raw(%d)", len);
break;
}
case T_FLOAT: {
const char *type_str = lib::is_oracle_mode() ? "binary_float" : "float";
DATA_PRINTF("%s", type_str);
DATA_PRINTF("FLOAT ");
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[0] <= 0) {
} else {
DATA_PRINTF("(%d,%d) ", parse_node.int16_values_[0], parse_node.int16_values_[1]);
}
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[3]) {
DATA_PRINTF("UNSIGNED ");
} else {
DATA_PRINTF("SIGNED ");
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_DOUBLE: {
const char *type_str = lib::is_oracle_mode() ? "binary_double" : "double";
DATA_PRINTF("%s", type_str);
break;
}
case T_UROWID: {
DATA_PRINTF("urowid(%d)", parse_node.int32_values_[OB_NODE_CAST_C_LEN_IDX]);
break;
}
case T_LOB: {
int16_t collation = parse_node.int16_values_[OB_NODE_CAST_COLL_IDX];
if (BINARY_COLLATION == collation) {
DATA_PRINTF("blob");
DATA_PRINTF("DOUBLE ");
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[0] <= 0) {
} else {
DATA_PRINTF("clob");
DATA_PRINTF("(%d,%d) ", parse_node.int16_values_[0], parse_node.int16_values_[1]);
}
if (OB_FAIL(ret)) {
} else if (parse_node.int16_values_[3]) {
DATA_PRINTF("UNSIGNED ");
} else {
DATA_PRINTF("SIGNED ");
}
if (OB_SUCC(ret) && parse_node.int16_values_[2]) {
DATA_PRINTF("ZEROFILL ");
}
break;
}
case T_JSON: {
DATA_PRINTF("json");
DATA_PRINTF("json ");
break;
}
case T_LONGTEXT: {
int16_t collation = parse_node.int16_values_[OB_NODE_CAST_COLL_IDX];
if (BINARY_COLLATION == collation) {
DATA_PRINTF("blob");
} else {
DATA_PRINTF("clob");
case T_GEOMETRY: {
int32_t flag = parse_node.int32_values_[1];
if (flag == 0) {
DATA_PRINTF("GEOMETRY ");
} else if (flag == 1) {
DATA_PRINTF("POINT ");
} else if (flag == 2) {
DATA_PRINTF("LINESTRING ");
} else if (flag == 3) {
DATA_PRINTF("POLYGON ");
} else if (flag == 4) {
DATA_PRINTF("MULTIPOINT ");
} else if (flag == 5) {
DATA_PRINTF("MULTILINESTRING ");
} else if (flag == 6) {
DATA_PRINTF("MULTIPOLYGON ");
} else if (flag == 7) {
DATA_PRINTF("GEOMETRYCOLLECTION ");
}
break;
}
@ -657,7 +1036,10 @@ int ObDMLStmtPrinter::print_json_table_nested_column(const TableItem *table_item
DATA_PRINTF(", ");
}
if (col_info.is_name_quoted_) {
DATA_PRINTF("\"%.*s\" ", LEN_AND_PTR(col_info.col_name_));
PRINT_QUOT;
DATA_PRINTF("%.*s", LEN_AND_PTR(col_info.col_name_));
PRINT_QUOT;
DATA_PRINTF(" ");
} else {
DATA_PRINTF("%.*s ", LEN_AND_PTR(col_info.col_name_));
}