Skip to content

Undefined variable but used #698

@Liyw979

Description

@Liyw979

I am using SootUp 1.1.2 to analyse https://repo1.maven.org/maven2/cn/hutool/hutool-db/5.7.18/hutool-db-5.7.18.jar.
Inside body of <cn.hutool.db.sql.SqlBuilder: cn.hutool.db.sql.SqlBuilder insert(cn.hutool.db.Entity,java.lang.String)>
tableName is used but undefined.
image
source code

	public SqlBuilder insert(Entity entity, String dialectName) {
		// 验证
		validateEntity(entity);

		final boolean isOracle = DialectName.ORACLE.match(dialectName);// 对Oracle的特殊处理
		final StringBuilder fieldsPart = new StringBuilder();
		final StringBuilder placeHolder = new StringBuilder();

		entity.forEach((field, value) -> {
			if (StrUtil.isNotBlank(field)) {
				if (fieldsPart.length() > 0) {
					// 非第一个参数,追加逗号
					fieldsPart.append(", ");
					placeHolder.append(", ");
				}

				fieldsPart.append((null != wrapper) ? wrapper.wrap(field) : field);
				if (isOracle && OracleDialect.isNextVal(value)) {
					// Oracle的特殊自增键,通过字段名.nextval获得下一个值
					placeHolder.append(value);
				} else {
					// 普通字段使用占位符
					placeHolder.append("?");
					this.paramValues.add(value);
				}
			}
		});

		// issue#1656@Github Phoenix兼容
		if (DialectName.PHOENIX.match(dialectName)) {
			sql.append("UPSERT INTO ");
		} else {
			sql.append("INSERT INTO ");
		}

		String tableName = entity.getTableName();
		if (null != this.wrapper) {
			// 包装表名 entity = wrapper.wrap(entity);
			tableName = this.wrapper.wrap(tableName);
		}
		sql.append(tableName)
				.append(" (").append(fieldsPart).append(") VALUES (")//
				.append(placeHolder).append(")");

		return this;
	}

jimple representation

    cn.hutool.db.Entity entity;
    cn.hutool.db.sql.SqlBuilder this;
    java.lang.String dialectName;
    unknown $stack10, $stack11, $stack12, $stack13, $stack14, $stack15, $stack16, $stack17, $stack18, $stack19, $stack20, $stack21, $stack22, $stack23, $stack24, $stack25, $stack26, $stack27, $stack28, $stack29, $stack30, $stack31, $stack32, $stack33, $stack34, $stack35, $stack36, $stack37, $stack7, $stack8, $stack9, fieldsPart, isOracle, placeHolder, tableName;


    this := @this: cn.hutool.db.sql.SqlBuilder;
    entity := @parameter0: cn.hutool.db.Entity;
    dialectName := @parameter1: java.lang.String;
    staticinvoke <cn.hutool.db.sql.SqlBuilder: void validateEntity(cn.hutool.db.Entity)>(entity);
    $stack7 = <cn.hutool.db.dialect.DialectName: cn.hutool.db.dialect.DialectName ORACLE>;
    isOracle = virtualinvoke $stack7.<cn.hutool.db.dialect.DialectName: boolean match(java.lang.String)>(dialectName);
    $stack8 = new java.lang.StringBuilder;
    specialinvoke $stack8.<java.lang.StringBuilder: void <init>()>();
    fieldsPart = $stack8;
    $stack9 = new java.lang.StringBuilder;
    specialinvoke $stack9.<java.lang.StringBuilder: void <init>()>();
    placeHolder = $stack9;
    $stack10 = dynamicinvoke accept <java.util.function.BiConsumer (cn.hutool.db.sql.SqlBuilder,java.lang.StringBuilder,java.lang.StringBuilder,boolean)>(this, fieldsPart, placeHolder, isOracle) <java.lang.invoke.LambdaMetafactory: java.lang.invoke.CallSite metafactory(java.lang.invoke.MethodHandles$Lookup,java.lang.String,java.lang.invoke.MethodType,java.lang.invoke.MethodType,java.lang.invoke.MethodHandle,java.lang.invoke.MethodType)>(methodtype: void __METHODTYPE__(java.lang.Object,java.lang.Object), handle: <cn.hutool.db.sql.SqlBuilder: void lambda$insert$0(java.lang.StringBuilder,java.lang.StringBuilder,boolean,java.lang.String,java.lang.Object)>, methodtype: void __METHODTYPE__(java.lang.String,java.lang.Object));
    virtualinvoke entity.<cn.hutool.db.Entity: void forEach(java.util.function.BiConsumer)>($stack10);
    $stack11 = <cn.hutool.db.dialect.DialectName: cn.hutool.db.dialect.DialectName PHOENIX>;
    $stack12 = virtualinvoke $stack11.<cn.hutool.db.dialect.DialectName: boolean match(java.lang.String)>(dialectName);

    if $stack12 == 0 goto label1;
    $stack32 = this.<cn.hutool.db.sql.SqlBuilder: java.lang.StringBuilder sql>;
    $stack33 = virtualinvoke $stack32.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>("UPSERT INTO ");

    goto label2;

  label1:
    $stack13 = this.<cn.hutool.db.sql.SqlBuilder: java.lang.StringBuilder sql>;
    $stack14 = virtualinvoke $stack13.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>("INSERT INTO ");

  label2:
    $stack34 = entity;
    $stack35 = virtualinvoke entity.<cn.hutool.db.Entity: java.lang.String getTableName()>();
    $stack37 = null;
    $stack36 = this;
    $stack15 = this.<cn.hutool.db.sql.SqlBuilder: cn.hutool.db.sql.Wrapper wrapper>;

    if $stack37 == $stack15 goto label3;
    $stack23 = this.<cn.hutool.db.sql.SqlBuilder: cn.hutool.db.sql.Wrapper wrapper>;
    tableName = virtualinvoke $stack23.<cn.hutool.db.sql.Wrapper: java.lang.String wrap(java.lang.String)>(tableName);

  label3:
    $stack24 = this;
    $stack16 = this.<cn.hutool.db.sql.SqlBuilder: java.lang.StringBuilder sql>;
    $stack25 = tableName;
    $stack17 = virtualinvoke $stack16.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>($stack25);
    $stack26 = " (";
    $stack18 = virtualinvoke $stack17.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>($stack26);
    $stack27 = fieldsPart;
    $stack19 = virtualinvoke $stack18.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.CharSequence)>($stack27);
    $stack28 = ") VALUES (";
    $stack20 = virtualinvoke $stack19.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>($stack28);
    $stack29 = placeHolder;
    $stack21 = virtualinvoke $stack20.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.CharSequence)>($stack29);
    $stack30 = ")";
    $stack22 = virtualinvoke $stack21.<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>($stack30);
    $stack31 = this;

    return $stack31;

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions