From caed29ad95d3bd23cd841ec8813e7bb3e8f4c1e7 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 9 Feb 2024 21:46:04 +0000 Subject: [PATCH] fix for update wait parser does not support decimal number --- src/sql/resolver/dml/ob_select_resolver.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/sql/resolver/dml/ob_select_resolver.cpp b/src/sql/resolver/dml/ob_select_resolver.cpp index 506166fd0c..734e8d131b 100644 --- a/src/sql/resolver/dml/ob_select_resolver.cpp +++ b/src/sql/resolver/dml/ob_select_resolver.cpp @@ -1417,6 +1417,27 @@ int ObSelectResolver::resolve_for_update_clause_oracle(const ParseNode &node) // nowait wait_us = 0; wait_us = wait_or_skip_node->value_ * 1000000LL; skip_locked = false; + } else if (wait_or_skip_node->type_ == T_SFU_DECIMAL) { + // "select * from t1 for update wait 1.0;" is same as "wait 1" + // "select * from t1 for update wait 1.5;" throw OB_ERR_REQUIRE_INTEGER + ObNumber value; + ObString time_str(wait_or_skip_node->str_len_, wait_or_skip_node->str_value_); + if (OB_ISNULL(allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("allocator is null", K(ret)); + } else if (OB_FAIL(value.from(wait_or_skip_node->str_value_, + wait_or_skip_node->str_len_, + *allocator_))) { + LOG_WARN("from number failed", K(ret)); + } else if (OB_UNLIKELY(!value.is_valid_int())) { + ret = OB_ERR_REQUIRE_INTEGER; + LOG_WARN("wait time not a integer value", K(ret), K(value)); + } else if (OB_FAIL(ObTimeUtility2::str_to_time( + time_str, wait_us, ObTimeUtility2::DIGTS_SENSITIVE))) { + LOG_WARN("str to time failed", K(ret)); + } else { + skip_locked = false; + } } } else { wait_us = -1;