n = ((int)sEnd.z) - (int)pBegin->z;
n = sEnd.z - pBegin->z;
void sqliteCreateView(  Parse *pParse,     /* The parsing context */  Token *pBegin,     /* The CREATE token that begins the statement */  Token *pName,      /* The token that holds the name of the view */  Select *pSelect,   /* A SELECT statement that will become the new view */  int isTemp         /* TRUE for a TEMPORARY view */){  Table *p;  int n;  const char *z;  Token sEnd;  DbFixer sFix;  sqliteStartTable(pParse, pBegin, pName, isTemp, 1);  p = pParse->pNewTable;  if( p==0 || pParse->nErr ){    sqliteSelectDelete(pSelect);    return;  }  if( sqliteFixInit(&sFix, pParse, p->iDb, "view", pName)    && sqliteFixSelect(&sFix, pSelect)  ){    sqliteSelectDelete(pSelect);    return;  }  /* Make a copy of the entire SELECT statement that defines the view.  ** This will force all the Expr.token.z values to be dynamically  ** allocated rather than point to the input string - which means that  ** they will persist after the current sqlite_exec() call returns.  */  p->pSelect = sqliteSelectDup(pSelect);  sqliteSelectDelete(pSelect);  if( !pParse->db->init.busy ){    sqliteViewGetColumnNames(pParse, p);  }  /* Locate the end of the CREATE VIEW statement.  Make sEnd point to  ** the end.  */  sEnd = pParse->sLastToken;  if( sEnd.z[0]!=0 && sEnd.z[0]!=';' ){    sEnd.z += sEnd.n;  }  sEnd.n = 0;  n = ((int)sEnd.z) - (int)pBegin->z;  z = pBegin->z;  while( n>0 && (z[n-1]==';' || isspace(z[n-1])) ){ n--; }  sEnd.z = &z[n-1];  sEnd.n = 1;  /* Use sqliteEndTable() to add the view to the SQLITE_MASTER table */  sqliteEndTable(pParse, &sEnd, 0);  return;}