Phân Tích Chi Tiết SQLExprTableSource Trong Druid

SQLExprTableSource Trong Druid: Các Thuộc Tính Và Phương Thức Toàn Diện

Cơ Bản

Tên đầy đủ: com.alibaba.druid.sql.ast.statement.SQLExprTableSource Lớp cha: SQLTableSourceImplSQLObjectImpl Chức năng: Biểu diễn nguồn bảng trong câu lệnh SQL FROM (bao gồm bảng đơn, view, hàm bảng, và các dạng db.table) Ứng dụng: Phân tích cú pháp SQL, kiểm tra quyền hạn, định tuyến phân bảng, chỉnh sửa SQL, duyệt cây cú pháp

Tất Cả Thuộc Tính Thành Viên

Tên thuộc tính Kiểu dữ liệu Quyền truy cập Mô tả
bieuThuc SQLExpr private Biểu thức bảng (cốt lõi: tên bảng/định danh)
tenGoi String protected Tên gọi khác của bảng
gachNho List<sqlhint> private Gợi ý bảng (ví dụ /\*+ ... \*/)
phanBo SQLPartitionClause private Lệnh phân vùng (ví dụ PARTITION(p1))
quayVeDiemXua SQLFlashbackClause private Lệnh quay về điểm trước đó

Danh Sách Phương Thức Hoàn Chỉnh

1. Hàm Khởi Tạo

SQLExprTableSource()
SQLExprTableSource(SQLExpr bieuThuc)
SQLExprTableSource(SQLExpr bieuThuc, String tenGoi)

2. Phương Thức Public Quan Trọng

Phương thức Trả Về Mô tả
getBieuThuc() SQLExpr Lấy biểu thức bảng
setBieuThuc(SQLExpr) void Đặt lại biểu thức bảng
getTenGoi() String Lấy tên gọi khác
setTenGoi(String) void Đặt tên gọi khác
getTenBang() String (Phiên bản 1.2.16+) Trả về tên bảng thuần
getTenKho() String (Phiên bản 1.2.16+) Trả về tên kho chứa
getGachNho() List<sqlhint> Lấy gợi ý bảng
getPhanBo() SQLPartitionClause Lấy phân vùng
clone() SQLExprTableSource Sao chép sâu
toString() String Xuất ra đoạn SQL

3. Phương Thức Protected Quan Trọng

Phương thức Trả Về Quyền Mô tả
getName() SQLName protected Chuyển đổi tự động bieuThuc thành SQLName
setName(SQLName) void protected Đặt nút tên bảng

4. Phương Thức Kế Thừa

// Nhận bộ xử lý AST (duyệt cần thiết)
void accept(SQLASTVisitor visitor)

Phân Tích Chi Tiết getName()

1. Mã Nguồn

protected SQLName getName() {
    if (bieuThuc instanceof SQLName) {
        return (SQLName) bieuThuc;
    }
    return null;
}

2. Vai Trò

  • Xác định tự động nếu bieuThuc là kiểu tên bảng
  • Trả về đối tượng SQLName (nút tên bảng)
  • Dễ dàng hơn getBieuThuc() vì không cần chuyển đổi thủ công

3. Trường Hợp Sử Dụng

  • Duyệt Visitor trong Druid
  • Phân tích liên kết bảng
  • Lấy tên bảng nhanh chóng

4. So Với getTenBang()

  • getName() trả về đối tượng SQLName, có thể lấy toàn bộ tên, tên kho, tên bảng
  • getTenBang() chỉ trả về chuỗi, chỉ tên bảng thuần

Các Phương Thức Thường Dùng Của SQLName

SQLName name = x.getName();

name.getTenDon()   // Tên bảng thuần: user
name.toString()    // Tên đầy đủ: db.user
name.getChuSoHuu() // Nút tên kho: db

Ví Dụ Sử Dụng

Ví Dụ 1: Duyệt Visitor

@Override
public boolean visit(SQLExprTableSource x) {
    SQLName name = x.getName();
    if (name == null) {
        return true;
    }

    String tableName = name.getTenDon();    // user
    String fullName = name.toString();      // db.user
    String alias = x.getTenGoi();           // u

    nameMap.computeIfAbsent(tableName, k -> new ArrayList<>()).add(x);
    aliases.add(alias);

    return true;
}

Ví Dụ 2: Phân Tích SQL Thông Thường

String sql = "SELECT * FROM db.user u";
SQLStatement stmt = SQLUtils.parseSingleMysqlStatement(sql);
SQLSelectQueryBlock query = (SQLSelectQueryBlock) ((SQLSelectStatement) stmt).getSelect().getQuery();

SQLExprTableSource ts = (SQLExprTableSource) query.getFrom();

String tableName = ts.getTenBang();    // user
String schema = ts.getTenKho();        // db
String alias = ts.getTenGoi();         // u
SQLExpr expr = ts.getBieuThuc();       // db.user node

Ví Dụ 3: Xây Dựng Bảng Nguồn

SQLPropertyExpr expr = new SQLPropertyExpr("db", "user");
SQLExprTableSource ts = new SQLExprTableSource(expr, "u");

System.out.println(ts.toString()); 
// Xuất: db.user u

Ví Dụ 4: Chỉnh Sửa SQL (Thay Đổi Tên Bảng)

ts.setBieuThuc(new SQLIdentifierExpr("user_2026"));

Tóm Tắt Quyền Gọi Phương Thức

  1. Mã bình thường: Chỉ dùng getBieuThuc() / getTenBang() / getTenGoi()
  2. Mã Visitor: Có thể dùng getName() (protected)
  3. Lấy tên bảng ưu tiên:
  • Trong Visitor: SQLName name = x.getName()
  • Ngoài mã: String tableName = x.getTenBang()
  • Tương thích nhất: ((SQLName)x.getBieuThuc()).getTenDon()

Thẻ: Druid SQLExprTableSource SQLParsing TableSourceAnalysis

Đăng vào ngày 3 tháng 6 lúc 18:37