def extract_set_statements()

in dbt/adapters/maxcompute/setting_parser.py [0:0]


    def extract_set_statements(self, s: str) -> ParseResult:
        settings: dict[str, str] = {}
        errors = []
        exclude_ranges = []
        current_state = State.DEFAULT
        lower_s = s.lower()
        i = 0
        current_start_index = -1
        s_length = len(s)

        while i < s_length:
            if current_state == State.DEFAULT:
                if i <= s_length - 2 and s[i : i + 2] == "--":
                    current_state = State.SINGLE_LINE_COMMENT
                    i += 2
                elif i <= s_length - 2 and s[i : i + 2] == "/*":
                    current_state = State.MULTI_LINE_COMMENT
                    i += 2
                elif i <= s_length - 3 and lower_s[i : i + 3] == "set":
                    if i + 3 < s_length and s[i + 3].isspace():
                        current_state = State.IN_SET
                        current_start_index = i
                        i += 4  # Skip 'set' and whitespace
                    else:
                        i += 1
                else:
                    if i < s_length and not s[i].isspace():
                        current_state = State.STOP
                    i += 1

            elif current_state == State.SINGLE_LINE_COMMENT:
                while i < s_length and s[i] != "\n":
                    i += 1
                if i < s_length:
                    i += 1
                current_state = State.DEFAULT

            elif current_state == State.MULTI_LINE_COMMENT:
                while i < s_length:
                    if i + 1 < s_length and s[i : i + 2] == "*/":
                        i += 2
                        current_state = State.DEFAULT
                        break
                    else:
                        i += 1

            elif current_state == State.IN_SET:
                while i < s_length and s[i].isspace():
                    i += 1
                if i < s_length:
                    current_state = State.IN_KEY_VALUE
                else:
                    errors.append("Invalid SET statement: missing key-value after 'set'")
                    current_start_index = -1
                    current_state = State.DEFAULT

            elif current_state == State.IN_KEY_VALUE:
                key_value_start = i
                found_semicolon = False
                while i < s_length:
                    if s[i] == ";" and (i == 0 or s[i - 1] != "\\"):
                        found_semicolon = True
                        i += 1
                        break
                    i += 1
                if found_semicolon:
                    kv = s[key_value_start : i - 1].strip()
                    if self._parse_key_value(kv, settings, errors):
                        exclude_ranges.append((current_start_index, i))
                else:
                    errors.append("Invalid SET statement: missing semicolon")
                current_state = State.DEFAULT
                current_start_index = -1

            elif current_state == State.STOP:
                i = s_length
        # Build remaining query
        remaining = []
        current_pos = 0
        for start, end in sorted(exclude_ranges, key=lambda x: x[0]):
            if current_pos < start:
                remaining.append(s[current_pos:start])
            current_pos = end
        if current_pos < s_length:
            remaining.append(s[current_pos:])

        return ParseResult(settings=settings, remaining_query="".join(remaining), errors=errors)