<!--
  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.
-->
<svg class="railroad-diagram" width="634" height="82" viewBox="0 0 634 82" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <g transform="translate(.5 .5)">
        <g>
            <path d="M20 21v20m10 -20v20m-10 -10h20"></path>
        </g>
        <path d="M40 31h10"></path>
        <g>
            <path d="M50 31h0"></path>
            <path d="M584 31h0"></path>
            <g class="terminal ">
                <path d="M50 31h0"></path>
                <path d="M163.5 31h0"></path>
                <rect x="50" y="20" width="113.5" height="22" rx="10" ry="10"></rect>
                <text x="106.75" y="35">ALTER TABLE</text>
            </g>
            <path d="M163.5 31h10"></path>
            <g>
                <path d="M173.5 31h0"></path>
                <path d="M310 31h0"></path>
                <path d="M173.5 31h20"></path>
                <g>
                    <path d="M193.5 31h96.5"></path>
                </g>
                <path d="M290 31h20"></path>
                <path d="M173.5 31a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10"></path>
                <g class="terminal ">
                    <path d="M193.5 51h0"></path>
                    <path d="M290 51h0"></path>
                    <rect x="193.5" y="40" width="96.5" height="22" rx="10" ry="10"></rect>
                    <text x="241.75" y="55">IF EXISTS</text>
                </g>
                <path d="M290 51a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10"></path>
            </g>
            <path d="M310 31h10"></path>
            <a xlink:href="https://ignite.apache.org/docs/3.0.0-alpha/sql-reference/ddl#qualified_table_name">
                <g class="non-terminal ">
                    <path d="M320 40h0"></path>
                    <path d="M510 40h0"></path>
                    <rect x="320" y="29" width="190" height="22"></rect>
                    <text x="415" y="44" fill="blue">qualified&#95;table&#95;name</text>
                </g>
            </a>
            <path d="M510 31h10"></path>
            <path d="M520 31h10"></path>
            <g>
                <path d="M530 31h0"></path>
                <path d="M584 31h0"></path>
                <g class="terminal ">
                    <path d="M530 31h0"></path>
                    <path d="M584 31h0"></path>
                    <rect x="530" y="20" width="54" height="22" rx="10" ry="10"></rect>
                    <text x="557" y="35">DROP</text>
                </g>
            </g>
        </g>
        <g fill="none" stroke="black" stroke-width="2">
            <path stroke-dasharray="5,5" d="M588 32 l30 0" />
        </g>
    </g>
    <style>
        svg {
        background-color: hsl(0,0%,100%);
        }
        path {
        stroke-width: 2;
        stroke: black;
        fill: rgba(0,0,0,0);
        }
        text {
        font: bold 14px monospace;
        text-anchor: middle;
        white-space: pre;
        }
        text.diagram-text {
        font-size: 12px;
        }
        text.diagram-arrow {
        font-size: 16px;
        }
        text.label {
        text-anchor: start;
        }
        text.comment {
        font: italic 12px monospace;
        }
        g.non-terminal text {
        /&#42;font-style: italic;&#42;/
        }
        rect {
        stroke-width: 2;
        stroke: black;
        fill: hsl(0,0%,100%);
        }
        rect.group-box {
        stroke: gray;
        stroke-dasharray: 10 5;
        fill: none;
        }
        path.diagram-text {
        stroke-width: 2;
        stroke: black;
        fill: white;
        cursor: help;
        }
        g.diagram-text:hover path.diagram-text {
        fill: #eee;
        }</style>
</svg>
