// File: /workspace/github_c_makefile_star2_O0/genometools[P]genometools/src/external/sqlite-3.33.0/sqlite3.c
// Function: impliesNotNullRow
static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){
  testcase( pExpr->op==TK_AGG_COLUMN );
  testcase( pExpr->op==TK_AGG_FUNCTION );
  if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune;
  switch( pExpr->op ){
    case TK_ISNOT:
    case TK_ISNULL:
    case TK_NOTNULL:
    case TK_IS:
    case TK_OR:
    case TK_VECTOR:
    case TK_CASE:
    case TK_IN:
    case TK_FUNCTION:
    case TK_TRUTH:
      testcase( pExpr->op==TK_ISNOT );
      testcase( pExpr->op==TK_ISNULL );
      testcase( pExpr->op==TK_NOTNULL );
      testcase( pExpr->op==TK_IS );
      testcase( pExpr->op==TK_OR );
      testcase( pExpr->op==TK_VECTOR );
      testcase( pExpr->op==TK_CASE );
      testcase( pExpr->op==TK_IN );
      testcase( pExpr->op==TK_FUNCTION );
      testcase( pExpr->op==TK_TRUTH );
      return WRC_Prune;
    case TK_COLUMN:
      if( pWalker->u.iCur==pExpr->iTable ){
        pWalker->eCode = 1;
        return WRC_Abort;
      }
      return WRC_Prune;

    case TK_AND:
      if( pWalker->eCode==0 ){
        sqlite3WalkExpr(pWalker, pExpr->pLeft);
        if( pWalker->eCode ){
          pWalker->eCode = 0;
          sqlite3WalkExpr(pWalker, pExpr->pRight);
        }
      }
      return WRC_Prune;

    case TK_BETWEEN:
      if( sqlite3WalkExpr(pWalker, pExpr->pLeft)==WRC_Abort ){
        assert( pWalker->eCode );
        return WRC_Abort;
      }
      return WRC_Prune;

    /* Virtual tables are allowed to use constraints like x=NULL.  So
    ** a term of the form x=y does not prove that y is not null if x
    ** is the column of a virtual table */
    case TK_EQ:
    case TK_NE:
    case TK_LT:
    case TK_LE:
    case TK_GT:
    case TK_GE: {
      Expr *pLeft = pExpr->pLeft;
      Expr *pRight = pExpr->pRight;
      testcase( pExpr->op==TK_EQ );
      testcase( pExpr->op==TK_NE );
      testcase( pExpr->op==TK_LT );
      testcase( pExpr->op==TK_LE );
      testcase( pExpr->op==TK_GT );
      testcase( pExpr->op==TK_GE );
      /* The y.pTab=0 assignment in wherecode.c always happens after the
      ** impliesNotNullRow() test */
      if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0)
                               && IsVirtual(pLeft->y.pTab))
       || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0)
                               && IsVirtual(pRight->y.pTab))
      ){
        return WRC_Prune;
      }
      /* no break */ deliberate_fall_through
    }
    default:
      return WRC_Continue;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x18(%rbp), %rax
movl 0x4(%rax), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x43096b
movl $0x1, -0x4(%rbp)
jmp 0x430acd
movq -0x18(%rbp), %rax
movzbl (%rax), %eax
addl $-0x2b, %eax
movl %eax, %ecx
movq %rcx, -0x30(%rbp)
subl $0x83, %eax
ja 0x430ac6
movq -0x30(%rbp), %rax
leaq 0x17540b(%rip), %rcx    # 0x5a5d9c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl $0x1, -0x4(%rbp)
jmp 0x430acd
movq -0x10(%rbp), %rax
movl 0x28(%rax), %eax
movq -0x18(%rbp), %rcx
cmpl 0x2c(%rcx), %eax
jne 0x4309cc
movq -0x10(%rbp), %rax
movw $0x1, 0x24(%rax)
movl $0x2, -0x4(%rbp)
jmp 0x430acd
movl $0x1, -0x4(%rbp)
jmp 0x430acd
movq -0x10(%rbp), %rax
movzwl 0x24(%rax), %eax
cmpl $0x0, %eax
jne 0x430a1e
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x42f650
movq -0x10(%rbp), %rax
cmpw $0x0, 0x24(%rax)
je 0x430a1c
movq -0x10(%rbp), %rax
movw $0x0, 0x24(%rax)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rsi
callq 0x42f650
jmp 0x430a1e
movl $0x1, -0x4(%rbp)
jmp 0x430acd
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x42f650
cmpl $0x2, %eax
jne 0x430a4c
movl $0x2, -0x4(%rbp)
jmp 0x430acd
movl $0x1, -0x4(%rbp)
jmp 0x430acd
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movzbl (%rax), %eax
cmpl $0xa4, %eax
jne 0x430a94
movq -0x20(%rbp), %rax
cmpq $0x0, 0x40(%rax)
je 0x430a94
movq -0x20(%rbp), %rax
movq 0x40(%rax), %rax
cmpl $0x0, 0x54(%rax)
jne 0x430abb
movq -0x28(%rbp), %rax
movzbl (%rax), %eax
cmpl $0xa4, %eax
jne 0x430ac4
movq -0x28(%rbp), %rax
cmpq $0x0, 0x40(%rax)
je 0x430ac4
movq -0x28(%rbp), %rax
movq 0x40(%rax), %rax
cmpl $0x0, 0x54(%rax)
je 0x430ac4
movl $0x1, -0x4(%rbp)
jmp 0x430acd
jmp 0x430ac6
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x30, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)