(req *SqlSelect)
| 1156 | } |
| 1157 | |
| 1158 | func (m *Sqlbridge) parseSources(req *SqlSelect) error { |
| 1159 | |
| 1160 | discardComments(m) |
| 1161 | |
| 1162 | if m.Cur().T != lex.TokenFrom { |
| 1163 | return m.ErrMsg("expected From") |
| 1164 | } |
| 1165 | |
| 1166 | m.Next() // consume From |
| 1167 | |
| 1168 | if m.Cur().T == lex.TokenIdentity { |
| 1169 | if err := m.parseSourceTable(req); err != nil { |
| 1170 | return err |
| 1171 | } |
| 1172 | } |
| 1173 | |
| 1174 | for { |
| 1175 | |
| 1176 | discardComments(m) |
| 1177 | |
| 1178 | src := &SqlSource{} |
| 1179 | //u.Debugf("parseSources %v", m.Cur()) |
| 1180 | switch m.Cur().T { |
| 1181 | case lex.TokenRightParenthesis: |
| 1182 | return nil |
| 1183 | case lex.TokenLeftParenthesis: |
| 1184 | // SELECT [columns] FROM [table] AS t1 |
| 1185 | // INNER JOIN (select a,b,c from users WHERE d is not null) u ON u.user_id = t1.user_id |
| 1186 | if err := m.parseSourceSubQuery(src); err != nil { |
| 1187 | return err |
| 1188 | } |
| 1189 | if m.Cur().T == lex.TokenRightParenthesis { |
| 1190 | m.Next() |
| 1191 | } |
| 1192 | case lex.TokenLeft, lex.TokenRight, lex.TokenInner, lex.TokenOuter, lex.TokenJoin: |
| 1193 | // JOIN |
| 1194 | if err := m.parseSourceJoin(src); err != nil { |
| 1195 | return err |
| 1196 | } |
| 1197 | case lex.TokenEOF, lex.TokenEOS, lex.TokenWhere, lex.TokenGroupBy, lex.TokenLimit, |
| 1198 | lex.TokenOffset, lex.TokenWith, lex.TokenAlias, lex.TokenOrderBy: |
| 1199 | return nil |
| 1200 | default: |
| 1201 | return m.ErrMsg("unexpected token") |
| 1202 | } |
| 1203 | |
| 1204 | discardComments(m) |
| 1205 | |
| 1206 | switch m.Cur().T { |
| 1207 | case lex.TokenAs: |
| 1208 | m.Next() // Skip over As, we don't need it |
| 1209 | src.Alias = m.Cur().V |
| 1210 | m.Next() |
| 1211 | // select u.name, order.date FROM user AS u INNER JOIN .... |
| 1212 | case lex.TokenIdentity: |
| 1213 | src.Alias = m.Cur().V |
| 1214 | m.Next() |
| 1215 | } |
no test coverage detected